Flo*_*sen 5 generics android kotlin
我正在尝试编写一个通用的基本活动,它指定它的ViewModel类型是一个通用参数:
abstract class BaseActivity<T : ViewModel> : AppCompatActivity()
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试为我的ViewModel编写一个惰性初始化属性:
val viewModel by lazy { ViewModelProviders.of(this, getFactory()).get(T) }
Run Code Online (Sandbox Code Playgroud)
显示的错误是 Type Parameter T is not an expression
也使用::class
或::class.java
没有帮助.有谁能解释这个问题?
编辑:我试图使用这样的内联函数:
inline fun <reified T : ViewModel?> AppCompatActivity.obtainViewModel(factory: ViewModelProvider.Factory): T {
return ViewModelProviders.of(this, factory).get(T::class.java)
}
Run Code Online (Sandbox Code Playgroud)
并像这样使用它:
abstract class BaseActivity<T> : AppCompatActivity() {
val viewModel by lazy { obtainViewModel<T>(getFactory())
}
Run Code Online (Sandbox Code Playgroud)
现在我得到错误,T不能用作具体参数.
EDIT2:到目前为止最好的解决方案似乎是:链接,但它在每个扩展类中实现抽象标记的开销.
您的类有一个类型参数T
,不幸的是它在运行时被删除。结果,调用get(T)
不起作用(我猜该方法Class
实际上需要一个?)。
您似乎已经注意到了这一点,因此尝试通过将处理封装到使用reified
类型的方法中来修复它。然而,您不能作为具体化参数传递,因为在调用 -typed 方法T
时该类型已经被删除。reified
结果,obtainViewModel<T>
也行不通。您可以做的是使用T
普通的泛型方法,如下所示:
class Typed<T> {
val lazyProp by lazy {
listOf<T>()
}
}
Run Code Online (Sandbox Code Playgroud)