This question already has answers here:
Is List<Dog> a subclass of List<Animal>? Why are Java generics not implicitly polymorphic?
                                
                                    (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