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