我正在(尝试)编写一个库,支持遗传数据的可变和不可变表示。显然,数据的可变表示应该与不可变表示遵循相同的接口,因为它可以执行与不可变表示相同的所有功能。这就是我开始遇到一些麻烦的地方。
数据以树结构表示。具有子节点的任何节点称为“祖先”,而携带遗传信息的节点称为“特征”。是祖先但不是特征的节点称为“基因组”,其表示整个树的根。
下面是代码的简化版本,用于显示子类型关系。
public sealed interface Ancestor : Iterable<Feature>
public sealed interface MutableAncestor : Ancestor, Iterable<MutableFeature>
public sealed interface Feature
public sealed interface MutableFeature : Feature
我的假设是,由于迭代器只产生而从不消耗指定的类型,因此这种类型的重写是法律的的。然而,编译器产生以下错误“可迭代对象的类型参数T具有不一致的值:我不清楚为什么这种安排会导致问题。我想确保客户端可以作为MutableAncestor访问节点,并简洁地迭代其后代,而不必将每个后代都转换为MutableFeature。
是否有一个好的解决方法来完成我想要完成的任务?
本质上,我希望这可以很好地进行类型检查,因为Iterable只需要提供iterator()函数,而Iterator<Feature>
是Iterator<MutableFeature>
的超类型,所以我只是感到困惑。
1条答案
按热度按时间y4ekin9u1#
我相信我的问题是this的重述。虽然我认为我想要完成的事情在这种情况下是有意义的,但我的理解是,允许它会带来一些与Java的互操作性问题。
我的解决办法是
这允许在for循环中使用Ancestor和MutableAncestor,尽管没有显式地将它们称为
Iterable
的实现。