5

こちらのAndroidドキュメント:http://developer.android.com/guide/components/fragments.htmlフラグメントはインターフェースを実装します。

onAttach()コールバックでは、現在のアクティビティをインターフェイスにキャストしているようです。概念的には、これはどのように可能であり、バニラ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

トピックに関するいくつかの基本的な知識:

interface関数のバンドルとして考えてください。classを実装する場合は、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渡されるのonAttach常にとの両方であるオブジェクトである必要があるActivityため、OnArticleSelectedListenerにキャストすることOnArticleSelectedListenerは常に成功する必要があります。

于 2012-08-30T19:53:04.520 に答える
3

アクティビティまたはその基本クラスの1つがインターフェースの実装として宣言されている場合、もちろんそれをインターフェースにキャストすることは可能です。

これは、バニラJavaの標準的な方法です。

ただし、onAttachが呼び出される値が完全にわからない場合は、ケースを実行する前にinstanceofでテストする必要があります。

于 2012-08-30T19:49:14.363 に答える
1

Androidデベロッパーガイドドキュメントのフラグメントセクションのアクティビティへのイベントコールバックの作成で、次のように記述されています。

mListenerメンバーは、OnArticleSelectedListenerのアクティビティの実装への参照を保持します

mListenerとは何ですか?

答えは:

リスナー(インターフェイス)タイプのオブジェクトで、アクティビティオブジェクトが配置されています。このアクティビティオブジェクトは、キャストプロセスで、リスナーインターフェイスを使用した同じメソッドを除くすべてのフィールドとメソッドを失いました。したがって、フラグメントでは、mListenerを呼び出してメソッドを実行すると次のようになります。

mListener.exampleMethod();

簡単に言えば、「He​​ymListener!」つまり、「インターフェイスから取得したメソッドを除くすべてのメソッドを失ったアクティビティオブジェクト」という意味で、そのメソッドを実行します。

英語が下手でごめんなさい!

于 2018-10-02T15:58:11.500 に答える