Kotlin泛型继承 – 类型不匹配

我正在尝试为领域对象构建一组提供程序。 这是我试图构建的一个示例结构:

接口:

interface IDataProvider<out T : RealmObject> { fun getRealmObject(): T } 

具有类型化提供者实例化的伴随功能的基本提供者类:

 open abstract class BaseProvider<out T : RealmObject> constructor(protected val context: Context?) : IDataProvider<T> { companion object { fun <T : RealmObject, E : BaseProvider<T>> create(context: Context?): E { if (something) { return SomeChildProviderProvider(context) } else { throw TypeNotSupportedException() } } } } 

这是一个小孩班:

 class SomeChildProvider(context: Context?) : BaseProvider<ChildRealmModel>(context){ override fun getRealmObject(): ChildRealmModel { throw UnsupportedOperationException("not implemented") } } 

我有问题是在线上

 return SomeChildProviderProvider(context) 

类型不匹配。 要求:E.找到:SomeChildProvider。

我不明白为什么它没有看到E实际上是SomeChildProvider。 谢谢。

PS我知道我可以把它交给E,但在我看来,在这种情况下不需要。 也许我错过了这里明显的东西,或者可能缺乏Kotlin的知识。

UPDATE1:在第一个答案之后,我们已经意识到上面的代码没有多大意义,因为我们必须定义一个返回的提供者类型并将其传递给create方法。 最初的想法是,创建方法返回一些类型,这是BaseProvider子类型。 以下是我为了支持最初的想法所做的改变:

IDataProvider

 interface IDataProvider { fun execute(realm: Realm) fun createModel(realm: Realm): RealmObject } 

BaseProvider

  open abstract class BaseProvider constructor(protected val context: Context?) : IDataProvider { override fun execute(realm: Realm) { realm.executeTransaction { r -> createModel(r) } } companion object { fun create(context: Context?): IDataProvider { if (something) { return ChildProvider(context) } else { throw TypeNotSupportedException() } } } } 

ChildProvider

 class ChildProvider(context: Context?) : BaseProvider(context) { override fun createModel(realm: Realm): ChildRealmModel { var realmObject = realm.createObject(ChildRealmModel ::class.java) //object property initialization return realmObject } } 

UI调用

 BaseProvider.create(context).execute(realm) 

虽然,createModel方法返回RealmObject,但它的实例将是ChildRealmModel。 我不喜欢的是,我们必须检查实例类型,如果我们需要其他地方的精确模型,

One Solution collect form web for “Kotlin泛型继承 – 类型不匹配”

你的代码不一致。

在函数声明中,你保证返回E ,它是BaseProvider<T>的子类型,可以由用户在呼叫站点上选择。

但是在实现中,你返回SomeChildProviderProvider ,它当然是BaseProvider<T>一个子类型,但是仍然可以和用户选择的E完全无关。

一个例子:

 class AnotherChildProvider : BaseProvider<ChildRealmModel>(context) {...} val x = BaseProvider.create<ChildRealmModel, AnotherChildProvider>(context) 

什么是x的类型? 根据函数签名,它必须是AnotherChildProvider 。 但是在函数内部返回SomeChildProviderProvider ,它不能被转换到AnotherChildProviderProvider

  • Kotlin代码编译为Jar用于Java Project?
  • 如何使重写单一表达式函数的返回类型为Unit?
  • 如何修改Kotlin序列的前缀,但保留尾巴?
  • 为什么spring-data-elasticsearch不使用Spring上下文中的objectmapper
  • 数据和开放不兼容,我有哪些替代方案?
  • 在Android的Fragment.newInstance()模式中使用Kotlin的@JvmOverloads
  • Kotlin:功能类型不匹配
  • “const”和“val”有什么区别?
  • Gradle编译在Linux上找不到tornadofx
  • 有没有可能在Kotlin源代码上使用Allatori?
  • 检查对象列表是否相等,而不在他们的List属性中进行订单检查
  • Kotlin language will be the best programming language for Android.