This question already has answers here:
Is List<Dog> a subclass of List<Animal>? Why are Java generics not implicitly polymorphic?
(17个答案)
2年前关闭。
我在创建一个小型应用程序时,偶然发现了以下问题。
我的应用程序中有一个
这是我可以简化的3个类:
。
。
错误在
我不明白为什么
顺便说一句,因为
(17个答案)
2年前关闭。
我在创建一个小型应用程序时,偶然发现了以下问题。
我的应用程序中有一个
List<Class<MyCustomBaseClass>>
,签名为public <T extends MyCustomBaseClass> void addClass(Class<T> clazz)
的函数。AddClass
应将clazz
放入列表中。但是我在那里出现以下错误:The method add(Class<MyCustomBaseClass>) in the type List<Class<MyCustomBaseClass>> is not applicable for the arguments (Class<T>)
这是我可以简化的3个类:
// Program.java
package me.mischa.stackoverflow;
import java.util.ArrayList;
import java.util.List;
public class Program {
private List<Class<MyCustomBaseClass>> _listOfClasses;
private static Program _instance;
public Program() {
_listOfClasses = new ArrayList<>();
}
public static void main(String[] args) {
Program program = new Program();
program.addClass(MyCustomChildClass.class);
}
public <T extends MyCustomBaseClass> void addClass(Class<T> clazz) {
_listOfClasses.add(clazz);
}
}
。
// MyCustomBaseClass.java
package me.mischa.stackoverflow;
public class MyCustomBaseClass {
}
。
// MyCustomChildClass.java
package me.mischa.stackoverflow;
public class MyCustomChildClass extends MyCustomBaseClass {
}
错误在
_listOfClasses.add(clazz);
行我不明白为什么
<T extends MyCustomBaseClass>
不应该与<MyCustomBaseClass>
兼容 最佳答案
Java的泛型是不变的。这意味着,作为类型参数的Class<MyCustomBaseClass>
恰恰意味着不允许表示MyCustomBaseClass
子类的Class对象。
在您的addClass
方法中,定义时只给了T
一个上限-T
可能是MyCustomBaseClass
的子类,例如您的班级MyCustomChildClass
。由于不匹配,编译器不允许此调用。
您可以通过提供匹配的上限来扩大_listOfClasses
中允许的范围,这将允许方法addClass
进行编译。
private List<Class<? extends MyCustomBaseClass>> _listOfClasses;
顺便说一句,因为
T
中的addClass
类型实际上并不重要,因此您可以删除它并使用通配符。public void addClass(Class<? extends MyCustomBaseClass> clazz) {
关于java - 为什么Class <T extended Base>不适用于Class <Base>? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52267175/
10-09 02:54