泛型参数与多态参数

  • 本文关键字:参数 多态 泛型 java
  • 更新时间 :
  • 英文 :


假设我有一个接口

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";。

最新更新