如何在参数中交叉引用类型
我试图在它们的通用参数中交叉引用类型。 在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
差异是可选的。
- Kotlin:由于textView,Android应用程序意外停止
- Android Studio 2.3.2和Kotlin 1.1.2-4 +数据绑定
- Android应用程序无法在任何模拟器中运行
- 在Android Studio 3.0 Canary中,Gradle Sync失败
- 在哪种情况下,Kotlin构造函数参数中需要val / var?
- 我应该为Android Studio 3.0 Canary 1使用哪些kotlin版本?
- Kotlin未解决的引用linkedListOf
- 在Android的Kotlin的帮助下开始一个项目
- 是否可以在Android Studio中将我的Kotlin文件移动到单独的包(源类型)中?