【问题标题】:Instanceof doesn't return right answerInstanceof 不返回正确答案
【发布时间】:2013-07-24 09:22:00
【问题描述】:

在 Android 上我有 3 节课

通则

public class General_Book {
protected String Titolo;
protected int Tag;

public General_Book(String t, int i) {
    Titolo = t;
    Tag=i;
}

public General_Book() {
    //
}

public void setTitolo(String t) {
    Titolo=t;
}
public void setTag(int i) {
    Tag=i;
}
public String getTitolo() {
    return Titolo;
}
public int getTag() {
    return Tag;
}
}

MOSTBOOK

public class Most_Book extends General_Book {
private String SubTitolo;
private float Rating;

public Most_Book(String t,String s,float d, int c) {
    super(t,c);
    SubTitolo=s;
    Rating=d;
}
public void setSubTitolo(String t) {
    SubTitolo=t;
}
public void setRating(float c) {
    Rating=c;
}
public String getSubTitolo() {
    return SubTitolo;
}
public float getRating() {
    return Rating;
}
}

TOPBOOK

 public class Top_Book extends General_Book{
private String Incipit;
private String imageUri;
public Top_Book(String t,String i,String u, int c) {
    super(t,c);
    Incipit=i;
    imageUri=u;
}
public Top_Book() {

}
public void setIncipit(String i) {
    Incipit=i;
}
public void setImageURI(String u) {
    imageUri=u;
}
public String getIncipit() {
    return (Incipit.length()>120) ? Incipit.substring(0, 117) + "..." : Incipit;

}
public String getImageURI() {
    return imageUri;
}
  }

现在在活动中,我有 2 个 ListView,一个带有 TopBook,另一个带有 MostBook 我创建了一个管理这两种类型的 CustomArrayAdapter,但它没有像我预期的那样工作 因为总是输入“instanceof”的第一个 IF,我不知道为什么,你能帮我解释一下我做错了什么吗?

CUSTOMARRAYADAPTER

 public class CustomArrayGeneralBook extends ArrayAdapter<General_Book> {
private final LayoutInflater mInflater;
public ImageLoader imageLoader;
public CustomArrayGeneralBook(Context context,General_Book[] tops) {
    super(context,android.R.layout.simple_list_item_2,tops);
    mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    imageLoader = new ImageLoader(context);
}


@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view;
    if (convertView == null) {
        view = mInflater.inflate(R.layout.fragment_home_child_mostbook, parent, false);  
    } else {
        view = convertView;
    }
    Object o = getItem(position);
    if(o instanceof General_Book) {
        Log.e("A","QUI");
        General_Book item = getItem(position);
        view.setTag(item.getTag());
    }
    else if (o instanceof Most_Book) {
        Log.e("A","QUI2");
        Most_Book item = (Most_Book) getItem(position);
        ((TextView)view.findViewById(R.id.most_book_title)).setText(item.getTitolo());
        ((TextView)view.findViewById(R.id.most_book_subtitle)).setText(item.getSubTitolo());
        ((RatingBar)view.findViewById(R.id.most_book_ratingbar)).setRating(item.getRating());
        view.setTag(item.getTag());
    }
    else if (o instanceof Top_Book) {
        Log.e("A","QUI3");
        Top_Book item = (Top_Book) getItem(position);
        ((TextView)view.findViewById(R.id.top_book_title)).setText(item.getTitolo());
        ((TextView)view.findViewById(R.id.top_book_incipit)).setText(item.getIncipit());
        imageLoader.DisplayImage(item.getImageURI(), (ImageView)view.findViewById(R.id.top_book_cov));
        view.setTag(item.getTag());
    }       
    return view;
}
 }

编辑 好的,最后我接受了答案,只是为了澄清大家:
如果不让应用程序崩溃,我必须在每个中添加不同的 Inflater.inflate(R.layout....) :)
谢谢

【问题讨论】:

    标签: android inheritance android-listview android-arrayadapter instanceof


    【解决方案1】:

    Most_Book 的一个实例也是 General_Book 的一个实例,因为 Most_Book 扩展了 General_Book。 (Top_Book 也是如此)。

    在您的情况下,您需要首先测试最具体的值:

    if(o instanceof Most_Book) {
         //...
    } else if (o instanceof Top_Book) {
         //...
    } else if (o instanceof General_Book) {
        //...
    }
    

    【讨论】:

      【解决方案2】:

      我相信你需要把ifs 放在另一个地方。因为如果oMost_BookGeneral_BookTop_Book的实例,它将进入第一个ifGeneral_BookTop_BookMost_Book的父类,是最通用的.从专门的检查开始if(),然后转向通用检查。

      if(o instanceof Top_Book) {
       //...
      } else if (o instanceof Most_Book) {
       //...
      } else if (o instanceof General_Book) {
      //...
      }
      

      参考JLS 15.20.2

      在运行时,如果 RelationalExpression 的值不为 null,并且可以将引用强制转换(第 15.16 节)到 ReferenceType 而不会引发 ClassCastException,则 instanceof 运算符的结果为真。否则结果为假。

      如果 oTop_BookMost_Book 的一个实例,那么下面的就可以了。

      General_Book b = o;
      

      因此if(o instanceof General_Book) 将永远是true

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-04
        • 1970-01-01
        • 2021-10-24
        • 2015-02-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多