如何在Java中的接口声明上应用更多约束?
假设我有以下接口:
interface Mammal {
void marry(Mammal m);
Mammal giveBirthTo();
}
但是,这并不能完全说出我想要什么。
显然,人类不能嫁给狗,也不能生下猫。那么,如何将此信息嵌入到接口中,以便输入类型和输出类型可以在实现时自动更改?
假设我有以下接口:
interface Mammal {
void marry(Mammal m);
Mammal giveBirthTo();
}
但是,这并不能完全说出我想要什么。
显然,人类不能嫁给狗,也不能生下猫。那么,如何将此信息嵌入到接口中,以便输入类型和输出类型可以在实现时自动更改?
您可以使用泛型并更改您的设计。
在以下方面:
interface Marriable<T extends Mammal> {
void marry(T sweetHalf);
T giveBirthTo();
}
...其中是你的顶级接口或抽象类,以及,等扩展/实现它。Mammal
Human
Dog
Unicorn
您可以使用递归类型变量生成接口:
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