创建ViewModel工厂时获取未经检查的强制转换警告

时间:2019-01-19 08:08:53

标签: android

我正在创建一个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");
    }    
}

有没有出路?

2 个答案:

答案 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
}

希望以后能帮到大家。