如何在参数中交叉引用类型

我试图在它们的通用参数中交叉引用类型。 在Java中,我有这样的:

public interface Group<C extends Child> { List<C> getChildren(); } public interface Child<G extends Group> { G getParent(); } class MyGroup implements Group<MyChild> { @Override public List<MyChild> getChildren() { return null; } } class MyChild implements Child<MyGroup> { @Override public MyGroup getParent() { return null; } } 

使用AndroidStudio的“转换为Kotlin”功能会导致:

 interface Group<C : Child<*>> { val children: List<C> } interface Child<G : Group<*>> { val parent: G } internal inner class MyGroup : Group<MyChild> { override val children: List<MyChild>? get() = null } internal inner class MyChild : Child<MyGroup> { override val parent: MyGroup? get() = null } 

其中抛出:有限的限制违反。

有没有什么办法可以在kotlin中编写这样的代码?

我不喜欢那种方式。 因为它会引入另一个通用参数。 相反,您可以引入一个中间角色Node接口来描述关系,例如:

 interface Node<out T>; interface Group<out C : Node<*>> : Node<C> { val children: List<C> } interface Child<out G : Group<*>> : Node<G> { val parent: G; } class MyGroup : Group<MyChild> { override val children: List<MyChild> get() = TODO("not implemented") } class MyChild : Child<MyGroup> { override val parent: MyGroup get() = TODO("not implemented") } 

中间角色就像kotlin.Function

 public interface Function<out R> 

注意out差异是可选的。