我正在研究类型系统,并且遇到了以下练习:
interface Food{} interface Plant extends Food{ void photosyntes(); } interface Animal extends Food{ void eat(Food food); }
我们想实现接口
Carnivore
,并扩展Animal
。其eat
方法将仅接受Animal的实例。此限制应由类型系统而不是动态检查强制实施。用上面的接口解释为什么不能做到这一点。在Java中,数组类型
Animal[]
是Food[]
的子类型。通常,如果S是T的子类型,则S []是T []的子类型。此规则要求在每个数组存储区执行运行时类型检查。描述一种情况,如果不执行此运行时检查,则Animal[]
数组可能包含Plant
。用Java代码进行说明。
我的直觉是,这个问题与协方差和协方差有关,但是我无法给出详尽的解释。
是因为必须使用类而不是接口?可以使用其他接口系统允许吗?