在此处的Android文档中:http://developer.android.com/guide/components/fragments.html Fragment实现了一个接口.
在onAttach()回调中,它似乎将当前的Activity转换为接口.从概念上讲,这是如何实现的,并且是与香草Java相同类型的演员标准练习?
public static class FragmentA extends ListFragment {
// Container Activity must implement this interface
public interface OnArticleSelectedListener {
public void onArticleSelected(Uri articleUri);
OnArticleSelectedListener mListener;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnArticleSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");
}
}
...
}
Run Code Online (Sandbox Code Playgroud)
关于该主题的一些基本知识:
把它想象interface成一堆功能.如果class实现了一个interface,那么它保证它已经实现了所有接口函数.
在你的情况下:
如果您有一个对象,并且您不需要对象实现的接口函数,那么您可以将该对象处理(并转换)到该接口.这样你就会丢失关于你的对象的"信息",因为你将无法使用它的功能(除了接口函数),但有时它足够了.
从实现某个接口的类创建的任何对象也是该接口的实例。
考虑一下:
public class Main {
public static void main(String[] args) {
MyClass mine = new MyClass();
checkIsFoo(mine);
}
public static void checkIsFoo(MyClass mine) {
System.out.print(mine+"");
if (mine instanceof MyFoo)
System.out.println(" is Foo!");
else
System.out.println(" is not Foo!");
}
public static interface MyFoo {
//
}
public static class MyClass implements MyFoo {
//
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,将打印出以下内容:Main$MyClass@52c8c6d9 is Foo!. 这表明该MyClass对象也是 的一个实例MyFoo。由于它们是共享实例,(MyFoo) mine因此也允许调用强制转换。
正如@antlersoft 所说,这是 vanilla Java 的一部分(可以在这里看到)。
因为,在这种情况下,Activity传递给的onAttach应该始终是既是Activity又是 的对象,因此将其OnArticleSelectedListener转换为OnArticleSelectedListener应该总是成功的。
| 归档时间: |
|
| 查看次数: |
5560 次 |
| 最近记录: |