在Java中,提供参数以扩展参数化接口的接口是它的确切同义词吗?

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。是否可以解决这种间接方式?

Thi*_*ilo 5

您要查找的内容称为类型别名

不幸的是,Java没有它们。

创建新接口时,该接口定义了新类型。的实例EggChicken也是的实例Egg<Chicken>,但并非相反。您必须使AnimalChicken(接口!)EggChicken显式返回。