我有:abstract class Vehicle
abstract class Car extends Vehicle
和abstract class Truck extends Vehicle
DodgeRam extends Truck
interface Dump
现在,我想限制Dump
接口,以便只能由Truck
的子类实现它,而不必明确地说Truck implement Dump
。我怎样才能做到这一点?
我以为可以将Dump
更改为interface Dump<T extends Truck>
,然后说DodgeRam implements Dump<DodgeRam>
。问题在于,没有什么可以阻止我说ToyotaCamary implements Dump
并仅保留类型。
更新:
我这样做的原因是因为我想避免很多类型检查/广播。假设我的Truck
具有isOffRoad
属性:
public class Truck {
private boolean isOffRoad;
public Truck(boolean isOffRoad) {
this.isOffRoad = isOffRoad;
}
public boolean isOffRoad() {
return isOffRoad;
}
}
假设我还有一个
Dealership
来管理我的Vehicle
列表:public class Dealership {
List<Truck> getTrucks() {...}
List<Dump>getDumpers() {...}
}
现在,我要检查所有“自卸车”的越野能力:
for (Dump dump: dealership.getDumpers() ) {
print dump.isOffRoad();
}
我不想每次都要进行类型检查/强制转换:
for (Dump dump: dealership.getDumpers() ) {
if (dump instanceOf Truck) {
print ((Truck)dump).isOffRoad();
}
}
最佳答案
不,接口始终旨在提供公共原型,我们不能限制用于实现接口的类。
您可以尝试做的一件事是..您可以在Dump
中定义class Truck
接口,并使Truck
类包的作用域而不是公共范围,并将Truck
的所有子类保留在同一包中。这样其他任何类都不能访问Truck
类,因此其他任何类都不能实现Dump
接口。 -尚未尝试,但猜想它可行。