如何在参数中交叉引用类型
我试图在它们的通用参数中交叉引用类型。 在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
差异是可选的。