我是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
由于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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。