我不能投入onclicklistener

时间:2017-12-07 17:16:03

标签: java android

我有两个简单的不同类,一个扩展另一个。 我的第一堂课是:

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

为什么我得到这个错误,即使我之前使用过此演员而且它有效?!

2 个答案:

答案 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。至少我能想到的唯一解释。你是如何填写该名单的?