我可以限制哪些类可以实现接口吗?

时间:2016-10-17 19:30:36

标签: java generics interface

我有:

  1. abstract class Vehicle
  2. abstract class Car extends Vehicleabstract class Truck extends Vehicle
  3. DodgeRam extends Truck
  4. interface Dump
  5. 现在我想限制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();
        }
    }
    

3 个答案:

答案 0 :(得分:2)

不,接口总是用于提供公共原型,我们不能限制类来实现接口。

您可以尝试的一件事是..您可以在Dump中定义class Truck接口,并使Truck类包范围而不是公共,并保留{{1}的所有子类1}}在同一个包中。这样任何其他类都无法访问Truck类,因此其他类不能实现Truck接口。 - 这没有尝试,但猜测它有效。

答案 1 :(得分:1)

根据定义,

接口是公共的,因此任何东西都可以实现它们。也许如果你解释了你的真正目标是什么,可能还有其他方法来实现它

答案 2 :(得分:1)

如果您只想Truck实施Dump,则interface不适合执行该工作。

相反,您必须Dump中存在的方法声明为Truckabstract或不依赖,具体取决于实施是否有意义电平)。

示例:

如果Dumppublic interface Dump { void foo(); }

然后Truck应为public abstract class Truck { public abstract void foo(); }

这样您就不会实施Dump,只有Truck的子类才能实现foo()