我正在创建一个小型应用程序,并且偶然发现了以下问题。
有一个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>
确切地说,没有 Class 对象代表 MyCustomBaseClass
的子类是允许的。
在您的 addClass
中方法,您只给出了 T
的上限定义它时 -- T
可能是 MyCustomBaseClass
的子类,例如你的类(class)MyCustomChildClass
。由于不匹配,编译器不允许此调用。
您可以扩大 _listOfClasses
中允许的范围通过提供匹配的上限,这将允许方法 addClass
编译。
private List<Class<? extends MyCustomBaseClass>> _listOfClasses;
顺便说一句,因为 T
到底是什么类型并不重要。位于addClass
,您可以将其删除并使用通配符。
public void addClass(Class<? extends MyCustomBaseClass> clazz) {
关于java - 为什么 Class<T extends Base> 不适用于 Class<Base>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52267175/