2016-10-18 5 views
1

コンパイラのインターフェイスの複数のデフォルト実装(以下に示す)の結果、コンパイラからプラットフォーム宣言クラッシュエラーが発生します。私はこのエラーを取得していますなぜ私が理解プラットフォーム宣言クラッシュwith Comparable

interface ClassA: Comparable<ClassA> 
{ 
    val x: Int 
     get 

    override fun compareTo(other: ClassA): Int = this.x.compareTo(other.x) 
} 

interface ClassB: Comparable<ClassB> 
{ 
    val y: String 
     get 

    override fun compareTo(other: ClassB): = this.y.compareTo(other.t) 
} 

data class ClassAB(val x: Int, val y: String): ClassA, ClassB 
{ 
    ... 
} 

。両方の既定の実装がcompareToの場合、JavaのcompareTo(Object)にマップされます。したがって、子供では、コトリンはどちらを使うべきかを知らない。

私が使用するものを選択できるようにするメカニズムがありますか、それとももっと良いですが、compareTo(Object)を上書きさせることができますか?私はcompareTo(Any)を定義しようとしましたが、それは正しくありませんでした。別の投稿は@JvmNameを使用して提案されていますが、注釈は(コンパイラごとに)ここでは適用されません。

ご協力いただければ幸いです。ありがとう!

+0

すべての '匹敵'へ '匹敵'あなたがこれを行うことができ、あなたがClassAB' 'で同じシグネチャでそれをオーバーライドします...しかし、あなたは比較チェック入力する必要がと同じクラスタイプでない場合に何をすべきかを決定する。 –

答えて

4

どちらかの比較対象を取り除かなければならないか、構図を使用することができます。それはユースケースに依存します。

これは構成の例です。あなたが変更した場合

data class ClassAB(val x: Int, val y: String): Comparable<ClassAB> 
{ 
    val classA: ClassA 
    val classB: ClassB 

    override fun compareTo(other: ClassAB): Int { 
     // do compare 
     classA.compareTo(other.classA) 
     classB.compareTo(other.classB) 
     throw UnsupportedOperationException("not implemented") 
    } 
} 
+2

+1。 'compareTo'実装は単純にインタフェースに属しません。それは具体的ではないものを比較するのは間違っています。 – Lovis

+0

@Lovis私は、概念的には、それが期待する状態に基づいて比較することができ、その状態に基づいてデフォルトの実装を提供できると言うことができます。インタフェースのデフォルトの実装と同様に、異なるものにしたい具体的な実装ではオーバーライドできます。しかし、私はこのケースでは奇妙で、奇妙な実装上の問題を引き起こすことに同意します。 –

+0

@JaysonMinardだから、私は "間違った" _ "_ ;-) – Lovis