我有两个简单的不同类,一个扩展另一个。 我的第一堂课是:
public class MyObject {}
没有任何内容。
和另一个:
public class People extends MyObject{
public String UserId;
public void setUserId(String userId) {
UserId = userId;
}
public String getUserId() {
return UserId;
}
}
我打算将myobject转换为适配器和onBindViewHolder方法中的人员,我可以做得很好并且工作正常,如下所示:
@Override
public void onBindViewHolder(final RecyclerViewHolder holder, int position) {
final People people = (People) array.get(position);
//array is:ArrayList<MyObject> array
...}
但问题是当我要在同一个类中进行此类强制转换但是在onclicklistener中这样:
holder.rlsearchitem.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
People people1= (People) savedPeopleArray.get(i);
//savedPeopleArray is:ArrayList<MyObject> savedPeopleArray
....
}
});
我收到此错误:
com.example.qa.setGet.MyObject cannot be cast to com.example.qa.setGet.People
为什么我得到这个错误,即使我之前使用过此演员而且它有效?!
答案 0 :(得分:1)
它是因为您在ArrayList array
中插入值作为People,例如:
private List<MyObject> array = new ArrayList()
然后在某处插入
final MyObject obj = new People();
array.add(obj)
简而言之,您在array
内插入运行时对象People,因此向下转换没有问题。
但在ArrayList savedPeopleArray
中插入MyObject,例如:
final MyObject obj = new MyObject();
savedPeopleArray = new MyObject();
在savedPeopleArray的运行时元素是具有MyObject类型的实例,因此无法向下转换为People
,因为值为MyObject
要防止ClassCastException
,您可以在投射前使用实例,例如
MyObject obj= savedPeopleArray.get(i);
if (obj instanceof People){
People people = (People) obj;
}
我认为此SO链接可以帮助您了解有关java What is the difference between up-casting and down-casting with respect to class variable
中的向上/向下转换的更多信息答案 1 :(得分:0)
我能想到为什么会发生这种情况的唯一解释是,你实际上在该列表中有MyObject,而不是People。
尝试添加
if ( savedPeopleArray.get(i) instanceof People )
可能只是实例化一个MyObject。至少我能想到的唯一解释。你是如何填写该名单的?