我有:


abstract class Vehicle
abstract class Car extends Vehicleabstract 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接口。 -尚未尝试,但猜想它可行。

10-01 19:01