类型T参数不相同



我有以下代码:

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

即使使用返回值,它也能工作,但必须指定正确的返回类型,即两个参数通用的类型。IntegerString都共享超类型Object;"相同类型";。Object是所有其它类型中的公共基类型。对于数字,Number也可以工作:

Number t = print(10, 20.0);
Object o = print("string", 12.3);

相关内容

最新更新