我正在创建一个,ViewmodelFactory以便我可以使用一个ViewModel可以接受参数的构造函数。但是,我在这条线上收到“未经检查的演员”警告 -
return (T) new clubPageViewModel(mDataSource);
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题?或者我在某个地方根本错了?
public class clubPageViewModelFactory implements ViewModelProvider.Factory {
private final String mDataSource;
public clubPageViewModelFactory(String dataSource) {
mDataSource = dataSource;
}
@NonNull
@Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
if (modelClass.isAssignableFrom(clubPageViewModel.class)) {
return (T) new clubPageViewModel(mDataSource);
}
throw new IllegalArgumentException("Unknown ViewModel class");
}
}
Run Code Online (Sandbox Code Playgroud)
有出路吗?
对于正在 Kotlin 中寻找解决方案的人,请尝试使用@Suppress("UNCHECKED_CAST")。波纹管是我的样本ViewModelFactory
class ViewModelFactory @Inject constructor(private val viewModels: MutableMap<Class<out ViewModel>, Provider<ViewModel>>) :
ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(modelClass: Class<T>): T =
viewModels[modelClass]?.get() as T
}
Run Code Online (Sandbox Code Playgroud)
我希望它对未来的每个人都有帮助。
您可以做的一件事是使用“ Uncheckedcasts ”注释来抑制警告。
检查示例:
@SuppressWarnings("unchecked") // This would be helpful for lint warnings for casts.
@NonNull
@Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
if (modelClass.isAssignableFrom(clubPageViewModel.class)) {
// Or better use here if it doesn't provides error @SuppressWarnings("unchecked")
return (T) new clubPageViewModel(mDataSource);
}
throw new IllegalArgumentException("Unknown ViewModel class");
}
Run Code Online (Sandbox Code Playgroud)
那么这个@SuppressWarnings注解有什么作用呢?
基本上,它指示应在带注释的元素中(以及在带注释的元素中包含的所有程序元素中)抑制指定的编译器警告。
请注意,给定元素中抑制的警告集是所有包含元素中抑制的警告的超集。
例如,如果您注释一个类以抑制一个警告,并注释一个方法以抑制另一个警告,则该方法中将抑制这两个警告。
作为一种风格问题,程序员应该始终在最深嵌套的元素上使用此注释(如果它有效)。如果要抑制特定方法中的警告,则应该注释该方法而不是其类。
您可以在此处查看有关此注释的更多详细信息。
| 归档时间: |
|
| 查看次数: |
2494 次 |
| 最近记录: |