如何在Java中的接口声明上应用更多约束?

2022-09-01 05:05:13

假设我有以下接口:

interface Mammal {
    void marry(Mammal m);
    Mammal giveBirthTo();
}

但是,这并不能完全说出我想要什么。

显然,人类不能嫁给狗,也不能生下猫。那么,如何将此信息嵌入到接口中,以便输入类型和输出类型可以在实现时自动更改?


答案 1

您可以使用泛型并更改您的设计。

在以下方面:

interface Marriable<T extends Mammal> {
    void marry(T sweetHalf);
    T giveBirthTo();
}

...其中是你的顶级接口或抽象类,以及,等扩展/实现它。MammalHumanDogUnicorn


答案 2

您可以使用递归类型变量生成接口:

interface Mammal<T extends Mammal<T>> {
  void marry(T m);
  T giveBirthTo();
}

这样,Java编译器可以为您提供一定的验证级别。但请注意,这种方法仍然容易被滥用。例如:

class Cat implements Mammal<Cat> {
  @Override void marry(Cat cat) { ... }
  @Override Cat giveBirthTo() { ... }
}

class Dog implements Mammal<Cat> { // implements wrong interface
  @Override void marry(Cat cat) { ... }
  @Override Cat giveBirthTo() { ... }
}

编译器只能确保通过同一接口的某个子类型实现接口,而不能通过实现它的特定类来实现接口。后一种类型约束不能用 Java 编程语言表示。Mammal