2016-03-23 22 views
0
class GenMethDemo { 
    static <T, V extends T> boolean isIn(T x, V[] y) { 
     for (int i = 0; i < y.length; i++) 
      if (x.equals(y[i])) 
       return true; 
     return false; 
    } 

    /*when compiled in java 7 it producing an error and compiling in java 8 without error */ 
    public static void main(String args[]) { 
     Integer nums[] = {1, 2, 3, 4, 5}; 
     String s[] = {"one", "two", "three"}; 
     System.out.println(isIn("fs", nums)); 
     /* 
     when compiled in java 7 it producing an error and compiling in java 8 without error */ 
    } 
} 
+3

質問を編集して問題を説明する*テキスト*を表示してください。特に、Java 7ではどのようなエラーが発生しますか? –

+0

'isIn(" fs "、nums)'は動作しません。その場合、 'T'は' String'、 'V'は' String'を拡張しない 'Integer'です。しかし、Java 8の型推論は、 'T = Object'と' V = Object'と一致するものを見つけることをより寛大にするかもしれません。 – Thomas

答えて

1

これは、Java 8の一般化されたターゲット型の推論の改善によるものです。実際、私は先週のような質問に答えました。 Java 8 call to generic method is ambiguous

質問Java 8: Reference to [method] is ambiguousの最初の回答も非常に良いです。

Java 8では、汎用メソッドに引き渡される引数の型を推論できます。 @Thomasがコメントしたように、タイプTObjectであると推定され、VObjectというオブジェクトであると推定されます(Integer)。 Java 7では、Integerは明らかにStringを拡張しないので、これはちょうどエラーを投げます。

0

Java 7では、T = StringV = Integerは、V extends Tを満たしません。

ただし、これが機能することをJavaの8つの状態のJLS:あなたのケースではこのように

List<Number> ln = Arrays.asList(1, 2.0); 

これはT = V = Objectに解決されるだろう。

関連する問題