我有以下代码:
public static <T> T print(T element1, T element2){
System.out.println(element1.getClass());
System.out.println(element2.getClass());
return null;
}
public static void main(String[] args) {
print(10, "str");
}
它编译了,没有错误。方法";打印";接受两个相同类型(T(的参数。但是我可以调用这个方法,例如,使用Integer和String参数。
如果我想使用返回值,代码不会编译:
Integer t = print(10, 20.0); //compilation error
此示例也具有相同的行为。我可以为Array和Element使用不同的类型(但如果我使用不同类型,我会得到ArrayStoreException(。
public static <T> void fillArray(T[] array, T element){}
如果我使用Collections,我就不能使用不同的类型。以下示例未编译:
public static <T> void fillList(List<T> list, T element){}
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
fillList(list, 20.0);
}
这种行为的原因是什么?如果我声明只有相同的类型T,为什么我可以用Arrays调用不同类型的方法,而不能用Lists调用?
在它工作的地方,您没有指定返回类型,所以编译器可以使用最通用的类型(Object
(。
一旦声明了返回类型(必须与传递的参数的类型相同(,就不能混合。
实际上,您也不会在它工作的地方混合,编译器只是在任何地方使用Object
。
即使使用返回值,它也能工作,但必须指定正确的返回类型,即两个参数通用的类型。Integer
和String
都共享超类型Object
;"相同类型";。Object
是所有其它类型中的公共基类型。对于数字,Number
也可以工作:
Number t = print(10, 20.0);
Object o = print("string", 12.3);