java - 在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
。是否有可能解决这种间接?
解决方案
您要查找的内容称为类型别名。
不幸的是,Java 没有它们。
当您创建一个新接口时,它定义了一个新类型。的实例EggChicken
也是 的实例Egg<Chicken>
,但反之则不然。您必须使您的AnimalChicken
(接口!)EggChicken
显式返回。
推荐阅读
- android - 如何使用 GridLayout 创建对话框?
- javascript - 如何确定两个 HTML 事件具有相同的来源(然后确定“事件已处理”)
- javascript - 向上滚动添加标题后滚动平滑过渡
- ios - 下载用于在本地通知上显示的图像不起作用
- python - 管道参数无效
- curve-fitting - 未找到最佳参数:函数调用次数已达到 maxfev = 100
- java - 如何将资源 id 传递给自定义视图并指示要为哪个子视图使用它?
- javascript - 将变量传递给后台脚本,并在不使用存储 api 的情况下跨选项卡在其他功能中使用它
- linux - LD_PRELOAD 如何更新库函数
- vb.net - VB WindowsForm 自定义类事件处理程序问题