2016-02-26 26 views
6

Her biri ana sınıfının iç sınıflarında bazı davranışları geçersiz kılan birkaç sınıf hiyerarşisi oluşturmaya çalışıyorum (Özellikle yineleyiciler, ancak önemli değil). Temelde, şuna benzer:İç sınıflar Kotlin'de kalıtım

open class SuperClass<T>{ 
    protected open inner class InnerClass{ 
     fun someLogic(){ 
      println("some logic happened") 
     } 

     open fun someOverridableLogic(){ 
      println("some logic happened") 
     } 
    } 
} 

class ChildClass<T> : SuperClass<T>(){ 
    protected inner class ChildInnerClass:InnerClass{ 
     override fun someOverridableLogic(){ 
      super.someOverridableLogic() 
      println("some OTHER logic happened") 
     } 
    } 
} 

Derleyici ChildInnerClass ondan devralan zaman InnerClass üzerinde türü parametresi bekliyor bu kodla çalışmayı reddeder. değil türlü parametrelerini bekliyoruz

protected inner class ChildInnerClass:InnerClass<T> 

derleyici aniden vermez: Ancak, böyle parametreyi ekledikten sonra!

Bunun

Java eşdeğer derler ve beklendiği gibi tür parametreleri olmadan çalıştırır :

public class SuperClass<T> { 
    protected class InnerClass{ 
     public void someLogic(){ 
      System.out.println("some logic happened"); 
     } 

     public void someOverridableLogic(){ 
      System.out.println("some logic happened"); 
     } 
    } 
} 


public class ChildClass<T> extends SuperClass<T>{ 
    protected class ChildInnerClass extends InnerClass{ 
     @Override 
     public void someOverridableLogic() { 
      super.someOverridableLogic(); 
      System.out.println("some OTHER logic happened"); 
     } 
    } 
} 

Yani, KOTLIN yanlış bir şey yapıyorum, ya da sadece ben yaklaşık farkında değildi bir dil kısıtlaması nedir?

cevap

5

Derleyici, InnerClass türünde bir tür bağımsız değişken beklemiyor ancak numaralı telefona SuperClass.InnerClass numaralı telefondan. Bu bilinen bir sorun: Capture generics in inner classes : KT-9208. Şimdilik

aşağıdakileri yapabilirsiniz:

open class SuperClass<T> { 
    protected open inner class InnerClass { 
     fun someLogic() { 
      println("some logic happened") 
     } 

     open fun someOverridableLogic() { 
      println("some logic happened") 
     } 
    } 
} 

class ChildClass<T> : SuperClass<T>() { 
    protected inner class ChildInnerClass : SuperClass<T>.InnerClass() { 
     override fun someOverridableLogic() { 
      super.someOverridableLogic() 
      println("some OTHER logic happened") 
     } 
    } 
} 

benzer örnek ve cevap için de Hadoop Context type parameters in Kotlin bakınız.

+0

Kotlin'e yeni bir soru olarak Piggybacking'i soruyorum: Kafamı bu konuya sokmaya çalışıyorum ve cevaptaki kod benim için derleme yapmıyor. 'InnerClass' da type parametresini eklemek zorunda kaldım, bu yüzden içsel ChildInnerClass: SuperClass .InnerClass ()' olarak bitti, ben bağlantılı cevabın ne yapması gerektiğini düşünüyorum ... bir şey mi eksik? – Augusto

+0

'InnerClass' üzerinde type parametresini, yalnızca bir type parametresiyle tanımladığınızda (' iç sınıf korumalı InnerClass '') bu parametrede 'InnerClass' tür parametresi gerektirmez ve bunun yerine ebeveyninden 'T'yi kullanır. SuperClass' – EiG

+0

@Augusto cevap kodu sizin için derleme yapmıyorsa, o zaman 'InnerClass' vb. Bazı değişiklikler yaptığınızı tahmin ediyorum. Bu nedenle, açıklık için, ben de dahil olmak üzere cevabın kodunu güncelledik "SuperClass" beyanı. Örneği yeni bir Kotlin dosyasına kopyalayıp yapıştırabilmeli ve sorunsuz bir şekilde derlenmelidir. Sizin için uygun değilse lütfen bize bildirin. – mfulton26