如何在不抑制警告的情况下解决android中未经检查的强制转换

如何在不抑制警告的情况下解决android中未经检查的强制转换,android,loader,unchecked-cast,Android,Loader,Unchecked Cast,如何在不使用SuppressWarning(“uncheckedcast”)的情况下解决此问题,这是在强制转换对象之前检查对象的任何方法,还是解决此问题的任何其他方法。 问题在onLoadFinished()中。正如您所看到的,我使用不同数据类型的数据,首先是布尔值,然后是列表。 先谢谢你 package com.howaboutthis.satyaraj.wallpaper; import android.support.v4.app.Fragment; import android.su

如何在不使用SuppressWarning(“uncheckedcast”)的情况下解决此问题,这是在强制转换对象之前检查对象的任何方法,还是解决此问题的任何其他方法。 问题在onLoadFinished()中。正如您所看到的,我使用不同数据类型的数据,首先是布尔值,然后是列表。 先谢谢你

 package com.howaboutthis.satyaraj.wallpaper;

import android.support.v4.app.Fragment;
import android.support.v4.content.Loader;
import android.content.Context;
import android.content.DialogInterface;    
import android.support.v4.app.LoaderManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import java.util.ArrayList;

import java.util.List;
import java.util.Objects;


public class FragmentChanging extends Fragment implements LoaderManager.LoaderCallbacks  {

    private ProgressDialog dialog;

    public FragmentChanging(){
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Override
    public View onCreateView(final LayoutInflater inflater, ViewGroup
    container,
                             Bundle savedInstanceState) {

        final View view = 
   inflater.inflate(R.layout.fragment_changing_wallpaper, container, false);

     getLoaderMangaer.init(0,null,FragmentChanging.this);

        return view;
    }

    @Override
    public Loader onCreateLoader(int id, Bundle args) {
        if (id == 0 || id == 2){
            dialog.setMessage("Loading Settings...");
            dialog.show();
              }
            return new TestInternetLoader(getContext());           
              }

        return null;
    }


    @Override
    public void onLoadFinished(Loader loader, Object data) {
        int id = loader.getId();

        if (id == 0 || id == 2){
            boolean check = (Boolean) data;
            if (check) 
                if (dialog.isShowing()) dialog.dismiss();
        }
        else if(id == 3)
            List<Bitmap> bitmaps = (List<Bitmap>) data;  //Unchecked cast

    }

    @Override
    public void onLoaderReset(Loader loader) {

    }

}  
package com.howaboutthis.satyaraj.wallper;
导入android.support.v4.app.Fragment;
导入android.support.v4.content.Loader;
导入android.content.Context;
导入android.content.DialogInterface;
导入android.support.v4.app.LoaderManager;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.Objects;
公共类FragmentChangeing扩展了片段实现LoaderManager.LoaderCallbacks{
私人对话;
公共碎片更改(){
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
}
@凌驾
创建视图(最终布局)上的公共视图充气机、视图组
集装箱,
Bundle savedInstanceState){
最终视图=
充气机。充气(R.layout.fragment\u Changed\u壁纸、容器、假);
init(0,null,FragmentChanging.this);
返回视图;
}
@凌驾
公共加载器onCreateLoader(int-id,Bundle-args){
如果(id==0 | | id==2){
setMessage(“加载设置…”);
dialog.show();
}
返回新的TestInternetLoader(getContext());
}
返回null;
}
@凌驾
public void onLoadFinished(加载器,对象数据){
int id=loader.getId();
如果(id==0 | | id==2){
布尔检查=(布尔)数据;
如果(检查)
if(dialog.isShowing())dialog.disease();
}
else if(id==3)
列表位图=(列表)数据;//未选中强制转换
}
@凌驾
公共void onLoaderReset(加载器){
}
}  

您可以使用
LoaderManager.LoaderCallbacks来消除lint警告。如果您想这样做,您必须(几乎)将每次出现的
Loader
更改为
Loader
。 (一个例外似乎是
onLoaderReset(加载程序)

此外,如果使用自定义的
AsyncTaskLoader
,则必须扩展
AsyncTaskLoader

然后你就可以写了

@Override
public void onLoadFinished(Loader<List<Bitmap>> loader, List<Bitmap> data) {

    List<Bitmap> bitmaps = data;
}
@覆盖
public void onLoadFinished(加载程序,列表数据){
列表位图=数据;
}
编辑

如果由于数据类型可能不同而无法使用建议的方法,则可以按如下方式检查要处理的类型:

if (data instanceof List<?>){
    List temp = (List)data;
    // do what's required for List data
    // (if necessary do a type check on list elements)
    if (tempList.size() > 0){
        Object firstItem = tempList.get(0);
        if (firstItem instanceof Bitmap){
            // now you know that your Loader gave you a List with at least one Bitmap
            List<Bitmap> bitmaps = new ArrayList<>();
            for (Object item: tempList){
                if (item instanceof Bitmap){
                    bitmaps.add((Bitmap) item);
                }
            }
        }
    }
}
else if (data instanceof Boolean){
   boolean check = (Boolean) data;
        if (check){ 
            // handle Boolean data   
        } 
}
if(列表的数据实例){
列表温度=(列表)数据;
//执行列表数据所需的操作
//(如有必要,对列表元素进行类型检查)
if(templast.size()>0){
objectfirstItem=templast.get(0);
if(位图的第一项实例){
//现在您知道加载程序提供了一个至少包含一个位图的列表
列表位图=新的ArrayList();
用于(对象项:圣殿骑士){
if(位图的项目实例){
位图。添加((位图)项);
}
}
}
}
}
else if(布尔值的数据实例){
布尔检查=(布尔)数据;
如果(检查){
//处理布尔数据
} 
}

如果(数据实例of List)
请说明如何声明LoaderManager.LoaderCallbacks错误,它表示instanceof@KostasDraki used的非法泛型类型实现了LoaderManager.LoaderCallbacks@0x0NoSugarth问题是,我将多次调用加载程序,数据将具有不同的数据类型,因此我不能使用泛型数据类型@0x0nosugarI。我已编辑了代码,以便您能够理解为什么我不能使用LoaderManager.LoaderCallbacks@0x0nosugarNope,不起作用。它仍然显示未选中的强制类型@0x0nosugar@SatyaraiMoily-如果在将单个列表项添加到位图列表之前也要检查它们,则不允许“未选中的强制转换”。我担心如果我们想写更少的代码,我们将不得不使用“抑制”或开始使用Kotlin而不是Java。