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

dex*_*019 7 android

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

有出路吗?

Chi*_*orn 7

对于正在 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)

我希望它对未来的每个人都有帮助。


Jee*_*ede 5

您可以做的一件事是使用“ 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注解有什么作用呢?

基本上,它指示应在带注释的元素中(以及在带注释的元素中包含的所有程序元素中)抑制指定的编译器警告。

请注意,给定元素中抑制的警告集是所有包含元素中抑制的警告的超集。

例如,如果您注释一个类以抑制一个警告,并注释一个方法以抑制另一个警告,则该方法中将抑制这两个警告。

作为一种风格问题,程序员应该始终在最深嵌套的元素上使用此注释(如果它有效)。如果要抑制特定方法中的警告,则应该注释该方法而不是其类。

您可以在此处查看有关此注释的更多详细信息。

  • 谢谢@Jeel,我知道 SuppressWarnings 可能是一条出路?但这是处理问题的理想方法还是只是一种解决方法?只是好奇! (6认同)