2016-02-26 12 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") 
     } 
    } 
} 

コンパイラはChildInnerClassはそれを継承したときにInnerClassの型パラメータを期待して、このコードで動作することを拒否します。しかし、このようにパラメータを追加した後:

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で何か間違ったことをやっている、またはそれは単に私がについて認識していなかった言語制限のですか?

答えて

5

InnerClassではコンパイラは期待していませんが、SuperClassではSuperClass.InnerClassにあります。これは既知の問題です: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に型パラメータを追加しなければならなかったので、 'inner class ChildInnerClass:SuperClass .InnerClass ()'となってしまいました。リンクされた答えが示唆していることです。 – Augusto

+0

'InnerClass'に型パラメータを指定する必要があります(' protected protected inner class InnerClass ')。このコードでは' InnerClass'は型パラメータを必要とせず、代わりに ' SuperClass' – EiG

+0

@Augusto答えのコードがコンパイルされない場合、InnerClassなどにいくつかの変更を加えたと推測しています。そのように、わかりやすくするために、答えのコードを更新して'SuperClass'宣言です。この例をコピーして新しいKotlinファイルに貼り付けることができるはずです。問題なくコンパイルする必要があります。それがあなたのためでない場合は、私たちにお知らせください。 – mfulton26