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 () } }
- 在Kotlin(Android)中以字符串形式读取文本资产(来自assets文件夹的文本文件)
- Android中的MVVM绑定
- 在onCreate()中创建的类的Java.lang.VerifyError卡住
- Kotlin IllegalStateException:在类路径中找不到资源:kotlin / .kotlin_string_table
- 通过Retrofit 2上传图像时是否可以显示进度条?
- 如何在RoomDatabase中存储Enum的ArrayList
- 对于用作表达式的Kotlin函数,有没有简洁的方法来操作并返回一个值?
- 使用kotlin的自定义风格中的ClassNotFoundException
- 对于Android,kotlin禁止警告