2015-10-28 5 views
6

次の汎用クラスを定義しましたが、クラスオブジェクトで使用するとコンパイルされません。 ダイヤモンドJava 7をコンパイルしていません

incompatible types: Pair<String,Integer> cannot be converted to Pair<Object,Object> 

が、なぜ最初のものはコンパイルしていないと第二のコンパイル:コンストラクタは、他のオブジェクトに

class Pair<T,V> { 

    T one; 
    V two; 


    public Pair(T one, V two) { 
     this.one = one; 
     this.two = two; 
    } 


} 
public static void main(String[] args) { 

    String hamza = "Hamza"; 
    Integer soufiane = 0; 

    Pair<Object,Object> pairOne = new Pair<>(hamza, soufiane); 
    Pair<Object,Object> pairTwo = new Pair<Object, Object>(soufiane, hamza); 

} 

エラーメッセージを受け入れないでしょうか?

EDIT:は、それは、Java 8

+0

何かがコンパイルされず、コンパイラがコンパイルしないと言うことはありません。 – Tom

+1

私はそこにエラーメッセージを含めました!それはダイヤモンド表記であり、少なくとも私の知る限りコンパイルする必要があります。なぜそれが私にテンプレートパラメータを含めることを余儀なくされたのか、私は理解できません。 –

+3

一般的な型はポリモーフではないので、 'Pair 'を 'Pair 'に割り当てることはできず、Java 7では 'Pair 渡された議論がそのタイプを伝えると述べた。一方、Java 8は、適切なジェネリック型を「見つける」と少し良くなります。 – Tom

答えて

3

あなたのコードにコンパイルされたJava 7コンパイラが適切な推論されたタイプを見つけることができないために失敗。一方、Java 8はコンパイルして正常に動作します。 (TL; DR:のJava 7が正常にすべてのダイヤモンドで動作しない、これはJava 8に改善された)

JEP 101: Generalized Target-Type Inference

スムーズ(I) 推論をサポートするための方法の型推論の範囲を拡大(ii)連鎖呼出しの推論。

意味Java 8はダイヤモンド演算子を使用して呼び出しのタイプを判別することができます。

編集:誰かがthreadでこの応答に私を打ち負かして、私よりもはっきりと説明しました。だから見て!

関連する問題