что означает эта ошибка при преобразовании из java-кода с общим в kotlin, один запрет после T?

пытаясь преобразовать некоторый код Java в kotlin и иметь проблемы с теми, у которых есть общий тип.

один образец здесь – это код Java от Danny Preussler's Post Bundles и ViewModels: здесь

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, не в состоянии сделать это правильно, поэтому, используя IDE студии Android, чтобы сделать это и получить этот результат, все же он показывает ошибку компилятора:

Ошибка: (24, 1) Класс «BundleAwareViewModelFactory» должен быть объявлен абстрактным или реализовать абстрактный элемент public abstract fun create (p0: Class!): T! определен в android.arch.lifecycle.ViewModelProvider.Factory

Ошибка: (28, 34) Параметр типа, связанный для T в fun create (p0: Class!): T! не выполняется: inferred type 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! является платформенным типом. Это значит, что Котлин не знает, как окажется конечное значение, будь то нуль или нет, и это оставляет его вам решать. Для вашего кода попробуйте это.

 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 } }