我正在阅读vogella的教程并遇到了这段代码:
public void onAttach(Activity activity) {
super.onAttach(activity);
if (activity instanceof OnItemSelectedListener) {
listener = (OnItemSelectedListener) activity;
} else {
throw new ClassCastException(activity.toString()+ " must implemenet MyListFragment.OnItemSelectedListener");
}
}
我不确定它的作用。这就是我所知道的:
我知道当片段与活动相关联时会调用onAttach。 我知道OnItemSelectedListener是一个接口 我知道它检查活动是否正确实现了此接口,但不确定以下代码的作用:listener =(OnItemSelectedListener)activity
我理解的是它的类型将它转换为OnItemSelectedListener ......但它还能做什么?
答案 0 :(得分:0)
在类声明中指定了接口。 Activity类可以扩展Activity并实现OnItemSelectedListener
。
public class MyActivity extends Activity implements OnItemSelectedListener { }
在调用Activity
时,代码只知道它是onAttach
类型,但您想要 OnItemSelectedListener
,因此您需要投射活动。这就是listener = (OnItemSelectedListener)activity
代码的作用,它会转换实例活动。因此,为了避免泛型ClassCastException
,首先执行检查,如果活动的类型不正确,则抛出具有更具体错误文本的异常。
没有什么特别的特殊功能,使用cast可以调用该接口中定义的方法。你没有得到任何新的实例或东西,监听器和活动是同一个对象。
答案 1 :(得分:0)
在你在vogella上阅读的教程项目之外,它实际上是无用的。此代码特别检查尝试与父活动关联的FragmentActivity
是否实现OnItemSelectedListener
,以及它执行此操作的原因是因为如果某个操作未实现{{1的所有属性它附加到OnItemSelectedListener
它将引发异常,因为Dalvik虚拟机将无法正确处理执行该特定操作的请求。
以下一行:
AdapterView
将类型为litener = (OnItemSelectedListener) activity;
的对象转换为类型为FragmentActivity
的对象,并将该值复制到OnItemSelectedListener
变量,该变量很可能是实现{{1}的类的属性有问题的方法。