为什么不能将这个泛型用作看似相同的界限的参数?

时间:2018-06-25 01:24:56

标签: java generics

我有一个构造函数和一个方法。

构造函数使用参数List<Class<? extends CalculatorOperation>> operationLists",然后将其用作第二个名为“ mapOperations()”的方法的参数。

mapOperations()接受参数List<Class<E>> operationLists,其中<E extends CalculatorOperation>

在我看来,这些界限似乎是相同的,但是我遇到一个错误,指出该参数不适用。为什么会发生这种情况,我该如何解决?

2 个答案:

答案 0 :(得分:0)

采用以下示例:

public static void main(String[] args) {
    doSomething(List.of(Integer.class, Double.class));      // Compiles fine
    doSomethingAgain(List.of(Integer.class, Double.class)); // Does NOT compile
}

static void doSomething(List<Class<? extends Number>> list) {

}

static <T extends Number> void doSomethingAgain(List<Class<T>> list) {

}

之所以会发生这种情况,是因为T extends Number仅期望一个孩子Number(我们首先指定了Integer.class,因此这是该方法所期望的),而? extends Number则期望孩子的任何组合Number类。

答案 1 :(得分:0)

它们不一样。您可以:

List<Class<? extends Animal>> animalTypes = new ArrayList<>();
animalTypes.add(Dog.class);
animalTypes.add(Cat.class);

但是您不能:

List<Class<T>> animalTypes = new ArrayList<>(); // Where class defines T extends Animal
animalTypes.add(Dog.class);
animalTypes.add(Cat.class);

这是因为情况1接受从Class扩展的任何Animal。情况2接受从Animal扩展的一个特定类。如果您的班级将T定义为Dog,则列表只能容纳Dog类型的班级。