假设我有一个接口
interface Car {
void wroomWroom();
}
以及实现这个接口的一堆类。
class Mercedes implements Car {
// implementation
}
class Volkswagen implements Car {
// Implementation
}
在代码的某个地方,我有两个功能
// ...
bool checkCarsGeneric(List<? extends Car> cars) {
System.out.println("Do generic checks");
return true;
}
bool checkCarsByInterface(List<Car> cars) {
System.out.println("Do generic checks");
return true;
}
这两个函数在语法上都是正确的,而且令人惊讶的是,它们都能正确工作。在什么情况下,我应该更喜欢List<? extends Car>
语法而不是List<Car>
语法,为什么?
UPD
这些函数的调用如下:
List<Car> cars = Arrays.asList(
new Mercedes(),
new Volkswagen(),
new Mercedes(),
new Volkswagen()
);
checkCarsGeneric(cars);
checkCarsByInterface(cars);
在字节码级别上,这两个函数实际上是相同的。
关键的区别在于,如果代码中有List<Volkswagen>
,可以将其传递到通用版本,但如果传递到非通用版本,则会出现编译器错误(或至少发出警告(。
在一个无关的旁注上;Volkswagen";是一个词,不应该在中间大写,并且;Mercedes";拼写为";c";。