如何将Android Activity转换为接口?

Zen*_*nce 4 java android

在此处的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)

Bal*_*des 8

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

把它想象interface成一堆功能.如果class实现了一个interface,那么它保证它已经实现了所有接口函数.

在你的情况下:

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


Eri*_*ric 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 {
        //
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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