java - 为什么调用具有不同类型的泛型方法会出现编译错误?

标签 java generics

我正在尝试学习 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> .变量类型aString ,它是 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/

相关文章:

swift - 仅类协议(protocol)作为具有 AnyObject 约束的关联类型的类型别名

java - 需要创建一个自定义类型的方法

java - 从 Java 调用 JCL

java - 使用 Java 创建图像的缩略图 View

java - Chain of Rep. 合适与否

java - 带有 Comparator<?> 参数的 TreeSet 构造函数

java - 如何在java项目中调用不同类的方法

java - 将 JTextArea 设置为像日志一样

java - 下面的泛型代码有什么作用?

delphi - 从专门的泛型类型派生