我有:
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
s列表:
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();
}
}
答案 0 :(得分:2)
不,接口总是用于提供公共原型,我们不能限制类来实现接口。
您可以尝试的一件事是..您可以在Dump
中定义class Truck
接口,并使Truck
类包范围而不是公共,并保留{{1}的所有子类1}}在同一个包中。这样任何其他类都无法访问Truck
类,因此其他类不能实现Truck
接口。 - 这没有尝试,但猜测它有效。
答案 1 :(得分:1)
接口是公共的,因此任何东西都可以实现它们。也许如果你解释了你的真正目标是什么,可能还有其他方法来实现它
答案 2 :(得分:1)
如果您只想Truck
实施Dump
,则interface
不适合执行该工作。
相反,您必须将Dump
中存在的方法声明为Truck
(abstract
或不依赖,具体取决于实施是否有意义电平)。
示例:
如果Dump
是public interface Dump { void foo(); }
然后Truck
应为public abstract class Truck { public abstract void foo(); }
这样您就不会实施Dump
,只有Truck
的子类才能实现foo()
。