代码之家  ›  专栏  ›  技术社区  ›  Mischa

为什么Class<T extends Base>不适用于Class<Base>?[副本]

  •  1
  • Mischa  · 技术社区  · 7 年前

    有一个 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>

    2 回复  |  直到 7 年前
        1
  •  2
  •   rgettman    7 年前

    Java的泛型是不变的。也就是说,作为类型参数, Class<MyCustomBaseClass> 也就是说,没有类对象表示 MyCustomBaseClass 是允许的。

    在你的 addClass T 定义时-- T型 可能是 MyCustomBaseClass MyCustomChildClass . 由于不匹配,编译器不允许此调用。

    _listOfClasses 通过提供匹配的上界,这将允许 添加类 编译。

    private List<Class<? extends MyCustomBaseClass>> _listOfClasses;
    

    顺便说一句,因为到底是哪种类型并不重要 T型 添加类 ,可以删除它并使用通配符。

    public void addClass(Class<? extends MyCustomBaseClass> clazz) {
    
        2
  •  0
  •   rzwitserloot    7 年前

    Number Integer Double ):

    List<Double> doublesOnly = new ArrayList<Double>();
    List<Number> numbers = doublesOnly;
    numbers.add(new Integer(5));
    Double d = doublesOnly.get(0);
    

    如果 这是一个有效的java,您将一个整数赋给一个Double,这是一个问题,因为整数不是Double。这就是为什么实际上,如果您试图编译上面的代码,它将不起作用;第二行被标记为无效java,因为 List<Double> List<Number> . 有一个解决方案:

    List<Double> doublesOnly = new ArrayList<Double>();
    List<? extends Number> numbers = doublesOnly;
    numbers.add(new Integer(5));
    Double d = doublesOnly.get(0);
    

    List<? extends Something> ,除 null

    在您的具体案例中,解决方案有两个方面:

    1. Class<?>

    2. 如果必须这样做,请尝试以下操作: List<Class<? extends MyCustomBaseClass>> Class<MyCustomChildClass> 添加到此列表。