2016-02-26 72 views
6

我試圖創建少數類的層次結構,每個類重寫它的父類的內部類中的一些行爲(特別是迭代器,但沒關係)。基本上,它看起來像這樣:Kotlin內部類繼承

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") 
     } 
    } 
} 

編譯器拒絕與此代碼工作,在預計將InnerClass類型參數時ChildInnerClass從它繼承。然而,添加參數這樣後:

protected inner class ChildInnerClass:InnerClass<T> 

編譯器突然不指望任何類型的參數!

相當於Java的這種編譯和執行符合預期,沒有類型參數:所以

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"); 
     } 
    } 
} 

,我是在做科特林做錯了事,或者是它只是一個語言限制,我是不知道的呢?

回答

5

編譯器不期待InnerClass上的類型參數,但在SuperClass.InnerClassSuperClass上。這是一個已知問題:Capture generics in inner classes : KT-9208

現在,你可以做到以下幾點:

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") 
     } 
    } 
} 

Hadoop Context type parameters in Kotlin見一個類似的例子和答案。

+0

捎帶一個問題,因爲我是Kotlin的新手:我試圖讓我的頭在這個問題上,答案上的代碼不會爲我編譯。我不得不在'InnerClass'上添加類型參數,所以它最終成爲'內部類ChildInnerClass:SuperClass .InnerClass ()',我認爲這是鏈接的答案建議做...我錯過了什麼嗎? – Augusto

+0

只有在用類型參數('protected open inner class InnerClass ')定義它時,你才需要在'InnerClass'上指定類型參數。在這段代碼中'InnerClass'不需要類型參數,而是從它的父類中使用T, SuperClass' – EiG

+0

@Augusto如果答案上的代碼沒有爲你編譯,那麼我猜你已經對'InnerClass'等進行了一些修改。爲了清晰起見,我已經更新了代碼中的答案,包括'SuperClass'聲明。您應該可以將示例複製並粘貼到新的Kotlin文件中,並且應該可以毫無問題地進行編譯。請讓我們知道,如果它不適合你。 – mfulton26