我是科特林的新手。在尝试将java应用程序转换为Kotlin时,我遇到了以下问题,因此请发布此问题。
这是一个模型视图绑定程序,下面是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<*>>> {}错误:该类型参数违反了有限界限制
发布于 2020-03-13 19:58:58
不能在Kotlin中转换1:1,因为Kotlin限制循环类型参数。
您可以解决它,添加其他语言支持的新类型参数,但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()
}
}
}https://stackoverflow.com/questions/60676051
复制相似问题