2017-04-19 21 views
1

私はgroovyでin演算子を使用しています。しかし今、私は奇妙な行動を見つけました。
次のスクリプトを参照してください。プリミティブ型とIN演算子

int x = 1 
long y = 1 

println "x == y   " + (x == y)   // true 
println "x == new Long(y) " + (x == new Long(y)) // true 
println "x in [y]   " + (x in [y])   // false Why? 
println "[y].contains(x) " + [y].contains(x) // false Why? 

inオペレータ又はリターンfalse、二つの数が同じであるが。しかし、なぜ?

コレクションにプリミティブ型を含めることはできませんが、x == new Long(y)はtrueであることがわかりました。

+1

ので、あなたが正しいです@dsharew – dsharew

+0

、それは同じオブジェクトではありません。しかし 'x == y'は真を返します。 –

+0

ええ、興味深い点ですが、そうではありません。 :) – dsharew

答えて

3

なぜ機能しないのですか?
xintであり、ylongであるためです。

なぜ(x == y)がtrueを返しますか?

(x == (int)y) 

あなたはグルーヴィーで[]構文グルーヴィーを使用してリストを作成背後ArrayListクラスを使用していますよう
==オペレータがそう(x == y)後ろにキャストする型使用することは同じです。だから、inとメソッドの復帰は方法implementaionに依存:

public boolean contains(Object o) { 
     return indexOf(o) >= 0; 
    } 

あなたはそれがindexOfメソッド呼び出しを見ることができるように:

public int indexOf(Object o) { 
     if (o == null) { 
      for (int i = 0; i < size; i++) 
       if (elementData[i]==null) 
        return i; 
     } else { 
      for (int i = 0; i < size; i++) 
       if (o.equals(elementData[i])) 
        return i; 
     } 
     return -1; 
    } 

indexOf方法は、実際のequalsメソッドの実装に依存オブジェクトが渡されました。あなたは関係なく、実際の値のintを渡していない場合、それはfalseを返します見ることができるように

public boolean equals(Object obj) { 
     if (obj instanceof Integer) { 
      return value == ((Integer)obj).intValue(); 
     } 
     return false; 
    } 

:あなたは[y].contains(x)を言うかx in [y]とき

だから、Integerequals()メソッドの実装を使用します。引数は値に関係なくlongのインスタンスではない場合、再びfalseを返し

public boolean equals(Object obj) { 
     if (obj instanceof Long) { 
      return value == ((Long)obj).longValue(); 
     } 
     return false; 
    } 

[x].contains(y)またはy in [x]はそれがLongを使用すると言う

場合のは、メソッドの実装に等しいです。

さらなる例として、このコードはfalseを返す必要があります:xはintであり、yが長い

int x = 1 
long y = 1 

x.equals(y) 
+0

総合的な答えをありがとう、それはすべて正しいです。しかし、私にとっては、それは醜い落とし穴です。たとえば、私の日常的な仕事では、project-id(long)が "projectId in [1,2,3]"であるかどうかをチェックすると、私は常にfalseになります。私は "projectId in [1l、2l、3l]"と書かなければなりません。 –

+0

ようこそ。ええ、あなたがしなければならないことは、あなたがあなたのリストに入れていることを他の言葉で知っていなければならないということです。したがって、検索中にリストに整数が含まれている場合は、 '' 'list.contains((int)param)' ''リスト内にlongが含まれている場合は '' 'list.contains((long)param) '' '' – dsharew

関連する問題