jmg*_*net 3 java generics inheritance interface
我想将接口用作参数化接口的简称,以避免使用通用语法污染所有代码。例如:
EggChicken egg = chicken.lay(); // Can't make it compile.
Run Code Online (Sandbox Code Playgroud)
代替:
Egg<AnimalChicken> egg = chicken.lay(); // Compiles happily.
Run Code Online (Sandbox Code Playgroud)
假设我想使用参数化类(https://en.wikipedia.org/wiki/Modes_of_reproduction)对动物繁殖模式进行建模。我有以下界面:
public interface Animal<T> {
T lay();
}
interface Viviparous<T extends Viviparous> extends Animal<T> {
}
interface Egg<T extends Oviparous> {
T hatch();
}
interface Oviparous<T extends Oviparous> extends Animal<Egg<T>> {
}
Run Code Online (Sandbox Code Playgroud)
这个想法是,胎生动物躺在同一动物的新实例,而卵生动物打好的鸡蛋孵化同一动物的新实例。
现在,我想定义更精确的接口来描述狗和鸡:
interface AnimalDog extends Viviparous<AnimalDog> {
}
interface AnimalChicken extends Oviparous<AnimalChicken> {
}
interface EggChicken extends Egg<AnimalChicken> {
}
Run Code Online (Sandbox Code Playgroud)
最后,这些是实现:
public class AnimalDogImpl implements AnimalDog {
@Override
public AnimalDog lay() {
return new AnimalDogImpl();
}
}
class AnimalChickenImpl implements AnimalChicken {
@Override
public EggChickenImpl lay() {
return new EggChickenImpl();
}
}
public class EggChickenImpl implements EggChicken {
@Override
public AnimalChicken hatch() {
return new AnimalChickenImpl();
}
}
Run Code Online (Sandbox Code Playgroud)
我想在代码中使用类时遇到问题:
public class AnimalTest {
@Test
public void can_do_something_nice() {
AnimalChicken chicken = new AnimalChickenImpl();
// Error here:
EggChicken egg = chicken.lay();
AnimalChicken chick = egg.hatch();
Assertions.assertThat(chick).isNotNull();
}
}
Run Code Online (Sandbox Code Playgroud)
我收到错误消息:必需EggChicken,找到Egg <AnimalChicken>,但这正是我定义的方式EggChicken。是否可以解决这种间接方式?
您要查找的内容称为类型别名。
不幸的是,Java没有它们。
创建新接口时,该接口定义了新类型。的实例EggChicken也是的实例Egg<Chicken>,但并非相反。您必须使AnimalChicken(接口!)EggChicken显式返回。