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

假设我有以下界面:

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

但是,这并不完全是我想要的。

显然,一个人不能娶一只狗,也不能生一只猫。 那么如何将这些信息embedded到接口中,使得inputtypes和输出types可以在实现时自动更改?

你可以使用generics并改变你的devise。

一些在以下方面的内容:

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

Mammal是你的顶级界面或抽象类, HumanDogUnicorn等扩展/实施它。

您可以使用recursiontypesvariables来生成接口:

 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() { ... } } 

编译器只能保证你通过相同接口的一些子types来实现Mammal接口,而不是由实现它的特定类来实现。 后一种types约束不能用Java编程语言来expression。

generics。 尝试

  private static interface Race { } private static class Human implements Race {} private static class Canine implements Race {} private static interface Being<R extends Race> { void marry(Being<R> other); Being<R> giveBirthTo(); } private void tryMe() { Being<Human> aHuman = new Being<Human>() { @Override public void marry(Being<Human> other) { } @Override public Being<Human> giveBirthTo() { return null; } }; Being<Canine> aCanine = new Being<Canine>() { @Override public void marry(Being<Canine> other) { } @Override public Being<Canine> giveBirthTo() { return null; } }; aHuman.marry(aCanine); // not possible }