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

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

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

class BundleAwareViewModelFactory<T extends ParcelableViewModel> 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中创建类型参数T(p0:Class!):T! 不满意:推断类型CapturedTypeConstructor(*)不是ViewModel的子类型!

 class BundleAwareViewModelFactory<T : ParcelableViewModel>(@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中呈现这些泛型,或者任何后续的关于kotlin中的泛型的讨论?

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

 class BundleAwareViewModelFactory<T : ParcelableViewModel>(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<T : ParcelableViewModel>(private val bundle: Bundle?, private val provider: ViewModelProvider.Factory) : ViewModelProvider.Factory { override fun <T : ViewModel>create(modelClass: Class<T>): T { val viewModel : T = provider.create(modelClass) as T if (bundle != null && viewModel is ParcelableViewModel) { viewModel.readFrom(bundle) } return viewModel } }