5

在此处的 Android 文档中:http: //developer.android.com/guide/components/fragments.html Fragment 实现了一个接口。

在 onAttach() 回调中,似乎将当前 Activity 转换为接口。从概念上讲,这怎么可能,并且在 vanilla 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");
        }
    }
    ...
}
4

4 回答 4

9

关于该主题的一些基本知识:

interfacea 视为一组功能。如果 aclass实现了 an interface,那么它保证它已经实现了所有的接口函数。

在你的情况下:

如果您有一个对象,并且您不需要的只是您的对象实现的接口的功能,那么您可以将该对象处理(并强制转换)到该接口。这样你就失去了关于你的对象的“信息”,因为你将无法使用它的功能(除了接口功能),但有时它就足够了。

于 2012-08-30T19:59:11.120 回答
5

从实现某个接口的类创建的任何对象也是该接口的实例。

考虑一下:

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 {
        //
    }
}

在这种情况下,会打印出以下内容:Main$MyClass@52c8c6d9 is Foo!. 这表明该MyClass对象也是 的一个实例MyFoo(MyFoo) mine由于它们是共享实例,因此也允许调用强制转换。

正如@antlersoft 所说,这是原版 Java 的一部分(可以在这里看到)。

因为,在这种情况下,Activity传递的 toonAttach应该始终是既是 theActivity又是 的对象,OnArticleSelectedListener将其转换为OnArticleSelectedListener应该总是成功的。

于 2012-08-30T19:53:04.520 回答
3

如果活动或其基类之一被声明为实现接口,当然可以将其转换为接口。

这是 vanilla Java 中的标准做法。

但是,如果您不确定将调用 onAttach 的值,则应在执行此案例之前使用 instanceof 进行测试。

于 2012-08-30T19:49:14.363 回答
1

在 Android Developer Guide 文档中,在 Fragment 部分中,在为活动创建事件回调中,写道:

mListener 成员持有对 OnArticleSelectedListener 的活动实现的引用

什么是 mListener?

答案是:

侦听器(接口)类型的对象,其中活动对象位于其中!此活动对象在转换过程中,除了与 Listener 接口相同的方法外,丢失了所有字段和方法。所以,在片段中,当我们调用 mListener 做一个方法时:

mListener.exampleMethod();

简而言之,“嘿,mListener!” 意思是,“嘿活动对象,除了从接口获取的方法之外,它丢失了所有方法”,执行那个方法!

我很抱歉英语不好!

于 2018-10-02T15:58:11.500 回答