java - 为什么 Class<T extends Base> 不适用于 Class<Base>?

标签 java generics

我正在创建一个小型应用程序,并且偶然发现了以下问题。

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

相关文章:

javascript - 在函数的@param 和@returns 中使用相同的泛型类型

Java - 服务提供者的实现

java - @ComponentScan basePackageClasses 有命名约定吗?

java - 不能使用来自不同 Maven 模块的类

java - 子/项目添加监听器gridview android?

java - 如何在 Java KeyStore 中加载多个 SSL 证书?

c# - .NET C# 设置由 lambda 选择器定义的字段的值

java - 我如何知道何时不再有来自 Google Datastore Java Library 的结果

c# - 迭代 T[] 转换为 IList<T> 的开销

java - 在 Android 中转换 AsyncTask