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 */
}
}
答案 0 :(得分:1)
这是由于Java 8中的广义目标类型推断改进。实际上,我上周回答了类似的问题。 Java 8 call to generic method is ambiguous
问题Java 8: Reference to [method] is ambiguous的第一个答案也非常好。
Java 8能够推断传递给泛型方法的参数类型。正如@Thomas在他的评论中所说,类型T
被推断为Object
,而V
被推断为扩展Object
的对象,所以{{ 1}}。在Java 7中,这只会引发错误,因为Integer
显然不会扩展Integer
。
答案 1 :(得分:0)
在Java 7中,类型推断会看到T = String
和V = Integer
不会满足V extends T
。
但是,Java 8的JLS声明这可行:
List<Number> ln = Arrays.asList(1, 2.0);
因此,在您的情况下,这将解析为T = V = Object
。