Kotlin中的通用类类型用法

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:到目前为止最好的解决方案似乎是:链接,但它在每个扩展类中实现抽象标记的开销.

s1m*_*nw1 2

您的类有一个类型参数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)