我有一个构造函数和一个方法。
构造函数使用参数List<Class<? extends CalculatorOperation>> operationLists"
,然后将其用作第二个名为“ mapOperations()”的方法的参数。
mapOperations()接受参数List<Class<E>> operationLists
,其中<E extends CalculatorOperation>
在我看来,这些界限似乎是相同的,但是我遇到一个错误,指出该参数不适用。为什么会发生这种情况,我该如何解决?
答案 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
类型的班级。