kotlin 为什么这些类型不兼容?潜在的变通方法?

ncgqoxb0  于 2023-05-07  发布在  Kotlin
关注(0)|答案(1)|浏览(232)

我正在(尝试)编写一个库,支持遗传数据的可变和不可变表示。显然,数据的可变表示应该与不可变表示遵循相同的接口,因为它可以执行与不可变表示相同的所有功能。这就是我开始遇到一些麻烦的地方。
数据以树结构表示。具有子节点的任何节点称为“祖先”,而携带遗传信息的节点称为“特征”。是祖先但不是特征的节点称为“基因组”,其表示整个树的根。
下面是代码的简化版本,用于显示子类型关系。

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>的超类型,所以我只是感到困惑。

y4ekin9u

y4ekin9u1#

我相信我的问题是this的重述。虽然我认为我想要完成的事情在这种情况下是有意义的,但我的理解是,允许它会带来一些与Java的互操作性问题。
我的解决办法是

public sealed interface Ancestor {
    public operator fun iterator(): Iterator<Feature>
}
public sealed interface MutableAncestor: Ancestor {
    public override fun iterator(): Iterator<MutableFeature>
}
public sealed interface Feature
public sealed interface MutableFeature : Feature

这允许在for循环中使用Ancestor和MutableAncestor,尽管没有显式地将它们称为Iterable的实现。

相关问题