对象引用的错误强制转换:未经检查/未确认的强制转换

时间:2016-03-23 22:22:14

标签: java android casting findbugs

请考虑以下代码:

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView =  (ImageView) convertView; //here

        if (imageView == null) {
            imageView = (ImageView) inflater.inflate(R.layout.item_gallery_image, parent, false);
        }
        ImageLoader.getInstance().displayImage(IMAGE_URLS[position], imageView, options);
        return imageView;
    }

来自Android Studio的Findbugs插件抱怨方法getview的第一行,它说:

未选中/未经确认的演员 这个强制转换是未选中的,并且并非所有类型的实例都可以转换为它所投射的类型。检查您的程序逻辑是否确保此强制转换不会失败。

有关如何解决此问题的任何想法?

3 个答案:

答案 0 :(得分:1)

并非每个View都是ImageView,因此FindBugs会尝试警告您投射可能会产生ClassCastException

但是,您实际上无法获得ClassCastException,因为convertView的工作方式是您接收null或者您收到View之前返回的getView() {1}}方法。由于您的方法始终返回ImageView,因此一切正常。

FindBugs发现潜在的代码问题,有时它们实际上根本不是问题。

答案 1 :(得分:1)

如果你想取悦FindBugs,你可以断言convertView是一个ImageView。

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = inflater.inflate(R.layout.item_gallery_image, parent, false);
    }
    assert convertView instanceof ImageView : convertView;
    ImageLoader.getInstance().displayImage(IMAGE_URLS[position], (ImageView) imageView, options);
    return imageView;
}

答案 2 :(得分:0)

我认为您尝试使用图像填充listView或回收视图的每一行...首先,您应该制作包含图像视图的布局,然后您可以这样做:

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        view=inflater.inflate(R.layout.adapter_row,parent,false);
        ImageView mImage=(ImageView) view.findViewById(R.id.imageid);
        ImageLoader.getInstance().displayImage(IMAGE_URLS[position], mImage, options);
        return view;
}