如何在参数中交叉引用类型
我试图在它们的通用参数中交叉引用类型。 在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
差异是可选的。
- 升级到Android Studio 3.1后无法加载“com.android.builder.Version”类
- Android Studio gradle项目(不是android项目),同步使gradle库丢失
- 在Android Studio中将“java”目录重命名为“kotlin”
- 在Android Studio中打断链式方法调用
- 可能在Lint中的错误
- 错误:执行任务':app:javaPreCompileDebug'失败。 > java.io.IOException:无法删除annotationProcessors.json
- transformClassesWithDesugar更新到AS 3.0 Canary后生成错误6
- Android Studio kaptDebugKoltin内部编译器错误
- Android工作室Kotlin插件错误