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");
}
}
}
,我是在做科特林做錯了事,或者是它只是一個語言限制,我是不知道的呢?
捎帶一個問題,因爲我是Kotlin的新手:我試圖讓我的頭在這個問題上,答案上的代碼不會爲我編譯。我不得不在'InnerClass'上添加類型參數,所以它最終成爲'內部類ChildInnerClass:SuperClass .InnerClass ()',我認爲這是鏈接的答案建議做...我錯過了什麼嗎? –
Augusto
只有在用類型參數('protected open inner class InnerClass')定義它時,你才需要在'InnerClass'上指定類型參數。在這段代碼中'InnerClass'不需要類型參數,而是從它的父類中使用T, SuperClass' –
EiG
@Augusto如果答案上的代碼沒有爲你編譯,那麼我猜你已經對'InnerClass'等進行了一些修改。爲了清晰起見,我已經更新了代碼中的答案,包括'SuperClass'聲明。您應該可以將示例複製並粘貼到新的Kotlin文件中,並且應該可以毫無問題地進行編譯。請讓我們知道,如果它不適合你。 – mfulton26