【问题标题】:Can I limit which classes can implement an interface?我可以限制哪些类可以实现接口吗?
【发布时间】:2016-10-17 19:30:35
【问题描述】:

我有:

  1. abstract class Vehicle
  2. abstract class Car extends Vehicle 和 abstract class Truck extends Vehicle
  3. DodgeRam extends Truck
  4. 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 来管理我的Vehicles 列表:

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();
    }
}

【问题讨论】:

  • 不,没有什么能阻止你。 Java怎么会知道?你怎么确定某个聪明的人会拿着割炬和焊工在某天不会在丰田凯美瑞的后部加装翻斗车?你不知道。
  • 可能是您发布了错误的问题。你能解释一下你最终想要达到的目标吗?
  • @David 更新了我的问题

标签: java generics interface


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果您只希望Truck 实现Dump,那么interface 不是完成这项工作的正确工具。

    相反,您必须将Dump 中存在的方法声明为Truck(abstract 或不使用,这取决于实现在此级别是否有意义)。

    例子:

    如果Dump 是public interface Dump { void foo(); }

    那么Truck应该是public abstract class Truck { public abstract void foo(); }

    这样你就不会实现Dump,只有Truck的子类可以实现foo()。

    【讨论】:

      【解决方案3】:

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

      您可以尝试的一件事是..您可以在class Truck 中定义Dump 接口,并使Truck 类包范围而不是public,并将Truck 的所有子类保留在同一个包中。这样没有其他类可以访问Truck 类,因此没有其他类可以实现Dump 接口。 - 这没有尝试过,但猜它有效。

      【讨论】:

        【解决方案4】:

        这在 java 17 中现在是可能的。

        public sealed interface TestInterface permits TestClass1, Testclass2 {
        
        }
        

        【讨论】:

          猜你喜欢
          • 2020-06-26
          • 2011-06-15
          • 1970-01-01
          • 1970-01-01
          • 2010-09-16
          • 1970-01-01
          • 2018-02-08
          • 1970-01-01
          • 2017-05-16
          相关资源
          最近更新 更多