这个错误是什么意思,当从java代码转换到通用的kotlin,单T后禁止?

试图将一些java代码转换为kotlin,并与genericstypes的问题。

这里的一个示例是Danny Preussler的Bundles和ViewModel的post的Java代码: 这里

class BundleAwareViewModelFactory implements ViewModelProvider.Factory { private final Bundle bundle; private final ViewModelProvider.Factory provider; public BundleAwareViewModelFactory(@Nullable Bundle bundle, ViewModelProvider.Factory provider) { this.bundle = bundle; this.provider = provider; } @SuppressWarnings("unchecked") @Override public T create(final Class modelClass) { T viewModel = (T) provider.create(modelClass); if (bundle != null) { viewModel.readFrom(bundle); } return viewModel; } } public abstract class ParcelableViewModel extends ViewModel { public abstract void writeTo(@NonNull Bundle bundle); public abstract void readFrom(@NonNull Bundle bundle); } 

试图将代码片段转换为kotlin代码,不能够做到这一点,所以使用android studio IDE来做到这一点,并得到这个结果,仍然显示编译器错误:

错误:(24,1)类’BundleAwareViewModelFactory’必须声明为抽象或实现抽象成员public abstract fun create(p0:Class!):T! 在android.arch.lifecycle.ViewModelProvider.Factory中定义

错误:(28,34)在fun中创建types参数T(p0:Class!):T! 不满意:推断typesCapturedTypeConstructor(*)不是ViewModel的子types!

 class BundleAwareViewModelFactory(@param:Nullable private val bundle: Bundle?, private val provider: ViewModelProvider.Factory) : ViewModelProvider.Factory { override fun create(modelClass: Class): T { val viewModel = provider.create(modelClass) as T if (bundle != null) { viewModel.readFrom(bundle) } return viewModel } } abstract class ParcelableViewModel : ViewModel() { abstract fun writeTo(bundle: Bundle) abstract fun readFrom(bundle: Bundle) } 

单身禁令T! 意思? 错误意味着什么,或者如何在kotlin中呈现这些generics,或者任何后续的关于kotlin中的generics的讨论?

2 Solutions collect form web for “这个错误是什么意思,当从java代码转换到通用的kotlin,单T后禁止?”

T! 是一个平台types。 这意味着,Kotlin不知道最终的价值将会如何,无论是否为零,所以它都会让你决定。 对于你的代码,试试这个。

 class BundleAwareViewModelFactory(bundle:Bundle?, provider:ViewModelProvider.Factory):ViewModelProvider.Factory { private val bundle:Bundle? private val provider:ViewModelProvider.Factory init{ this.bundle = bundle this.provider = provider } override fun create(modelClass:Class<*>):T { val viewModel = provider.create(modelClass) as T if (bundle != null) { viewModel.readFrom(bundle) } return viewModel } } abstract class ParcelableViewModel:ViewModel() { abstract fun writeTo(@NonNull bundle:Bundle) abstract fun readFrom(@NonNull bundle:Bundle) } 

有一个工作版本,但不知道如何做得更好:

 class BundleAwareViewModelFactory(private val bundle: Bundle?, private val provider: ViewModelProvider.Factory) : ViewModelProvider.Factory { override fun create(modelClass: Class): T { val viewModel : T = provider.create(modelClass) as T if (bundle != null && viewModel is ParcelableViewModel) { viewModel.readFrom(bundle) } return viewModel } } 
  • 如何从命令行运行Kotlin类?
  • 在Spring Boot项目中使用Gradle从Kotlin测试引用Java代码时未解决的参考
  • 保持Java中的BaseActivity与Kotlin Activity兼容
  • 如何输出/打印到TextView的值
  • 如何在Kotlin中创建一个匿名接口的实例?
  • 如何使用kotlin显示在recyclerview中选择的单个项目
  • 枚举懒惰属性
  • Kotlin错误:无法findorg.jetbrains.kotlin:kotlin-stdlib-jre7:1.0.7
  • 什么是Java相当于Kotlin的函数types?
  • 在SpringBoot中,Firebase连接在Linux上不起作用
  • 如何在Intellij 15降级Kotlin
  • Kotlin language will be the best programming language for Android.