2016-04-07 16 views
6

私はクラスのためにcompareToと演算子をオーバーロードしようとしていました。Kotlinで過負荷になる

比較演算子に問題はありません。これはメンバとしても拡張機能としてもうまく機能します。

equals演算子はメンバで、equals funをオーバーライドする必要があります。

class MyClass { 
    companion object { 
     private val NUMBER: Int = 5 

     operator fun compareTo(value: Int) = NUMBER - value 

     override operator fun equals(other: Any?) = 
       when (other) { 
        is Int -> NUMBER == other 
        else -> throw Exception("") 
       } 
    } 
} 

fun test() { 
    if (MyClass < 10) { 
     //ok 
    } 

    //Operator '==' cannot be applied to 'MyClass.companion' and kotlin.Int 
    if (MyClass == 5) { 
    } 
} 

編集:適切に '==' オーバーロードする方法は?

+0

なぜこれが欲しいのか混乱しています。正しく実装された 'equals'メソッドは、それ自身と比較されたとき以外は常にコンパニオンオブジェクトに対して' false'を返します(これはデフォルト/継承された動作です)。 – mfulton26

答えて

3

定義equalshashCodethis issueによると、明示的なスーパータイプを持っていないobject宣言の多少役に立たないと考えられています。おそらく正しいequals + hashCodeの実装はobjectにありますが、使用例はほとんどありません。

あなたがそうしようとすると警告を示しIDE検査でもあります:

IDE warning screenshot
オブジェクトが宣言スーパータイプを持っているときに警告がありません。

しかし、私はいくつかの技術的な理由は、オーバーロード演算子を解決するからKotlinを停止し、全体の挙動がおかしいと思いませんので、私はKotlinの問題追跡にan issueを提出しました。今のよう

(Kotlin 1.0.2 EAP)、でも宣言スーパータイプで、あなたはそれがスーパータイプとして持っているまったく同じ宣言タイプのインスタンスとobjectの平等をチェックすることができます

object SomeObject : List<Int> by listOf() { ... } 
SomeObject == listOf(1, 2, 3) // OK 
SomeObject == arrayListOf(1, 2, 3) // not resolved (why?) 

object MyObject : Any() { ... } 
MyObject == 1 // error 
MyObject == 1 as Any // OK o_O 

object AnotherObject { ... } 
AnotherObject == 1 as Any // works! Probably Any is supertype here 
を拡張機能として equalsを定義するよう

:いいえ、あなたはextensions are resolved staticallyので、それを行うことはできませんし、(同様のquestion about toStringがあります)メンバーの影にされています。

関連する問題