我正在尝试学习 Java 泛型。我写了一个方法:
public <T> T Gmethod(T a,Collection<T> list){
return a;}
虽然用 Gmethod("A",list);
调用它很好,但 list 是 Object
的类型,
但是用 Gmethod(new Object(),list);
调用它是错误的,其中 list 是 String
的类型,
为什么?
最佳答案
拥有
<T> T method(T a, Collection<T> list) { return a; }
并调用它
Collection<Object> list = new LinkedList<>();
method("A", list);
将导致编译器推断类型 Object
对于类型变量 T
, 作为 list
类型为 Collection<Object>
.变量类型a
是String
,它是 Object
的子类型.所以这个方法调用是允许的。
调用方法
Collection<String> list = new LinkedList<>();
method(new Object(), list);
将再次导致编译器为类型变量推断类型 Object T
,就像现在一样a
类型为 Object
.所以编译器请求参数 list
的参数类型为 Collection<Object>
(或子类型)。 但是Collection<String>
不是 Collection<Object>
的子类型. 所以编译器不允许调用这个方法。
关于java - 为什么调用具有不同类型的泛型方法会出现编译错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21276914/