Kotlin中generics类的用法

我正在尝试编写一个通用的基本活动,它指定它的ViewModel键入一个通用的参数:

abstract class BaseActivity : AppCompatActivity() 

现在我正在尝试为ViewModel编写一个延迟的初始化属性:

 val viewModel by lazy { ViewModelProviders.of(this, getFactory()).get(T) } 

显示的错误是Type Parameter T is not an expression

还使用::class::class.java没有帮助。 谁能解释一下这个问题吗?

编辑:我试图使用像这样的一个具体化的内联函数:

 inline fun  AppCompatActivity.obtainViewModel(factory: ViewModelProvider.Factory): T { return ViewModelProviders.of(this, factory).get(T::class.java) } 

像这样使用它:

 abstract class BaseActivity : AppCompatActivity() { val viewModel by lazy { obtainViewModel(getFactory()) } 

现在我得到错误,T不能被用作一个具体的参数。

编辑2:到目前为止最好的解决方案似乎是这样的: 链接 ,但它的开销,以实现每个扩展类中的抽象标记。

你的类有一个types参数T ,不幸的是在运行时被擦除。 因此,调用get(T)不起作用(我猜这个方法实际上期望一个Class ?)。

你似乎已经注意到了,因此试图用处理types的方法来封装处理。 然而,你不能把T作为一个具体的参数,因为这个types在被调用的方法被调用的时候已经被擦除了。 结果, obtainViewModel也不起作用。 你可以做什么,是使用T的普通的generics方法,下面说明:

 class Typed { val lazyProp by lazy { listOf() } }