首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin泛型:从Java迁移的困难

Kotlin泛型:从Java迁移的困难
EN

Stack Overflow用户
提问于 2020-03-13 19:12:29
回答 1查看 105关注 0票数 2

我是科特林的新手。在尝试将java应用程序转换为Kotlin时,我遇到了以下问题,因此请发布此问题。

这是一个模型视图绑定程序,下面是java接口。关键是模型和视图是相互依存的。

代码语言:javascript
复制
interface Model<T extends View<?>> {}

interface View<T extends Model<?>> {}

class RealModel implements Model<RealView> {}

class RealView implements View<RealModel> {}

class Binder<T extends Model<?>> {

     static <ModelT extends Model<?>> Binder<ModelT> of(View<ModelT> view) {}

}

// Application code
Binder<RealModel> binder = Binder.of(new RealView());
binder.bind(new RealModel());

我能在科特林做这个吗?

我尝试了以下方法

代码语言:javascript
复制
interface Model<T : View<*>> {}

错误:该类型参数违反了有限界限制

代码语言:javascript
复制
interface Model<T : View<Any>> {}

错误:类型参数不在其范围内:应该是'Model<*>‘的子类型

代码语言:javascript
复制
interface Model<T : View<Model<*>>> {}

错误:该类型参数违反了有限界限制

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-13 19:58:58

不能在Kotlin中转换1:1,因为Kotlin限制循环类型参数。

您可以解决它,添加其他语言支持的新类型参数,但Kotlin不支持,这是self类型参数(在我的示例中用S标识),并将self类型参数和其他类型参数设置为协变类型(使用out):

代码语言:javascript
复制
interface Model<out S : Model<S, T>, out T : View<T, S>>

interface View<out S : View<S, T>, out T : Model<T, S>>

class RealModel : Model<RealModel, RealView>

class RealView : View<RealView, RealModel>

class Binder<T : Model<*, *>> {
    companion object {
        fun <ViewT : View<*, ModelT>, ModelT : Model<ViewT, *>> of(view: ViewT): Binder<ModelT> {
            throw RuntimeException()
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60676051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档