开发者社区> 问答> 正文

Kotlin泛型:从Java迁移时遇到的麻烦

我是Kotlin的新手。当尝试将Java应用程序转换为Kotlin时,我遇到了以下问题,因此发布了此问题。

这是一个Model-View-Binder应用程序,下面是Java接口。关键是模型和视图相互依赖。

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());

我可以在科特林这样做吗?

我尝试了以下

interface Model<T : View<*>> {}

错误:此类型参数违反有限限制

interface Model<T : View<Any>> {}

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

interface Model<T : View<Model<*>>> {}

错误:此类型参数违反有限限制

问题来源:Stack Overflow

展开
收起
montos 2020-03-26 20:53:15 737 0
1 条回答
写回答
取消 提交回答
  • 由于Kotlin会限制循环类型参数,因此您无法在Kotlin中将其转换为1:1。

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

    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()
            }
        }
    }
    

    回答来源:Stack Overflow

    2020-03-26 20:53:42
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载