我正在创建一个ViewmodelFactory
,以便可以使用可以接受参数的ViewModel
构造函数。但是,我在此行收到“未经检查的演员表”警告-
return (T) new clubPageViewModel(mDataSource);
如何解决此问题?还是某个地方我根本上错了?
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");
}
}
有没有出路?
答案 0 :(得分:2)
您可以做的一件事是使用注释标记“ 未经检查的演员”来取消警告。
检查示例:
@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");
}
那么,此 @SuppressWarnings
批注有什么作用?
基本上,它指示命名的编译器警告应为 在带注释的元素(以及所有程序元素中被抑制)
。请注意,在给定元素中禁止显示的警告集是 在所有包含的元素中禁止显示警告的超集。
例如,如果您为课程添加注释以禁止显示一条警告,并且 注释一个抑制另一个的方法,两个警告都将 在该方法中被禁止。
从风格上讲,程序员应始终在 最有效的嵌套元素。如果你想 禁止使用特定方法发出警告,您应添加注释 方法而不是其类。
您可以查看有关此注释的更多详细信息here。
答案 1 :(得分:0)
对于在 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
}
希望以后能帮到大家。