首页 > 解决方案 > 在java中,提供参数以扩展参数化接口的接口是它的同义词吗?

问题描述

我想使用接口作为参数化接口的短名称,以避免使用通用语法污染所有代码。例如:

EggChicken egg = chicken.lay();  // Can't make it compile.

代替:

Egg<AnimalChicken> egg = chicken.lay(); // Compiles happily.

假设我想使用参数化类(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>> {
}

这个想法是胎生动物产下同一动物的新实例,而卵生动物下的孵化同一动物的新实例。

现在,我想定义更精确的接口来描述狗和鸡:

interface AnimalDog extends Viviparous<AnimalDog> {
}

interface AnimalChicken extends Oviparous<AnimalChicken> {
}

interface EggChicken extends Egg<AnimalChicken> {
}

最后,这些是实现:

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();
    }
}

当我想在代码中使用这些类时,我的问题就来了:

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();
    }
}

我收到错误:Required EggChicken, found Egg<AnimalChicken>,但这正是我定义的方式EggChicken。是否有可能解决这种间接?

标签: javagenericsinheritanceinterface

解决方案


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

不幸的是,Java 没有它们。

当您创建一个新接口时,它定义了一个新类型。的实例EggChicken也是 的实例Egg<Chicken>,但反之则不然。您必须使您的AnimalChicken(接口!)EggChicken显式返回。


推荐阅读