-3
mCallback = (OnHeadlineSelectedListener) activity;

これは、Android アプリのチュートリアル用の Java コードです。これが何をしているのか正確にはわかりません。mCallback に値を割り当てていることは知っていますが、何ですか? OnHeadlineSelectedListener が括弧内にあり、アクティビティ オブジェクトがそのすぐ後ろにあるのはなぜですか?

/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.vizoplex.my.first.app;

import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class HeadlinesFragment extends ListFragment {
    OnHeadlineSelectedListener mCallback;

    // The container Activity must implement this interface so the frag can deliver messages
    public interface OnHeadlineSelectedListener {
        /** Called by HeadlinesFragment when a list item is selected */
        public void onArticleSelected(int position);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // We need to use a different list item layout for devices older than Honeycomb
        int layout = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ?
                android.R.layout.simple_list_item_activated_1 : android.R.layout.simple_list_item_1;

        // Create an array adapter for the list view, using the Ipsum headlines array
        setListAdapter(new ArrayAdapter<String>(getActivity(), layout, Ipsum.Headlines));
    }

    @Override
    public void onStart() {
        super.onStart();

        // When in two-pane layout, set the listview to highlight the selected list item
        // (We do this during onStart because at the point the listview is available.)
        if (getFragmentManager().findFragmentById(R.id.article_fragment) != null) {
            getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        }
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        // This makes sure that the container activity has implemented
        // the callback interface. If not, it throws an exception.
        try {
            mCallback = (OnHeadlineSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnHeadlineSelectedListener");
        }
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        // Notify the parent activity of selected item
        mCallback.onArticleSelected(position);

        // Set the item as checked to be highlighted when in two-pane layout
        getListView().setItemChecked(position, true);
    }
}
4

6 に答える 6

2

それが型キャストです。例: run と eat の 2 つのメソッドを持つ Animal インターフェイスがあります。

public interface Animal {
    public String run();
    public String eat(String food);
}

そして、それを実装するクラス、たとえば Cat クラスがあります。Cat クラスには、scratch と mew という追加のメソッドがいくつかあります。

public class Cat implements Animal{
   public String run(){
     return "Run as a cat";
   }
   public String eat(){
     return "Eat fish";
   }
   public String mew(){
     return "MEW!!!!";
   }
   public String scratch(){
     return "scratch-scratch-scratch";
   }
}

また、bark メソッドを持つ Dog クラスもあります。

public class Dog implements Animal{
   public String run(){
     return "Run as a dog";
   }
   public String eat(){
     return "Eat meat";
   }
   public String bark(){
     return "BARK!!!!";
   }
}

そのため、特定の動物 (犬や猫) と同じように、動物と一緒に作業する必要があることがよくあります。しかし、コンパイラの cat は、あなたの助けなしにはこのキャストを行いません。したがって、正確に何が欲しいかを伝える必要があります。

public void Show{
  Cat cat = new Cat(); //you have a cat
  Dog dog = new Dog(); //and a dog
  Animal animal = null; //and animal
  dog = (Dog)animal; //and here is where compiler can't convert animal to dog without your help.
  Animal animal2 = cat; //But this casting it can make without your help, as it exactly knows what to do.
}

この一冊でJavaを学ぶのにとても役立ちます。そのようなことを理解することに本当に興味があるなら、それを読むべきです。キャストがどのように機能するかについての完全な説明も、この本にあります。

于 2012-10-30T20:10:46.320 に答える
2

OnHeadlineSelectedListenerおそらく、この実際のアクティビティがそれを拡張するため、そのアクティビティを にキャストしようとしていListenerます。このように、mCallback はコールバックが正しく定義されたリスナーとして機能します。

編集

あなたが持っている:

try {
    mCallback = (OnHeadlineSelectedListener) activity;
} catch (ClassCastException e) {
    throw new ClassCastException(activity.toString()
            + " must implement OnHeadlineSelectedListener");
}

にキャストしようとしactivityていOnHeadlineSelectedListenerます。activityがこのリスナーを実装していない場合、例外がスローされます。メッセージは非常に簡単です。

activity.toString()+ " must implement OnHeadlineSelectedListener"
于 2012-10-30T18:56:55.680 に答える
1

activityに割り当てられているオブジェクトにキャストされています。OnHeadlineSelectedListenermCallback

于 2012-10-30T18:56:04.000 に答える
1

mCallback オブジェクトはアクティビティ オブジェクトのクラスのサブクラスだと思います。したがって、このステートメントはアクティビティ オブジェクトをより具体的な mCallback オブジェクトにキャストします。

キャスティングについて詳しくはこちら

于 2012-10-30T18:58:01.803 に答える
0

アクティビティを OnHeadlineSelectedListener にキャストしています。アクティビティが OnHeadlineSelectedListener を実装していると想定しています。これは、インターフェイス OnHeadlineSelectedListener でメソッドを直接呼び出すことができるように行われています。

于 2012-10-30T18:56:34.723 に答える
0

私は最近 Java から移行しましたが、その行がtype にキャスト されているように見えます。キャストはある型を別の型にし、型に互換性がない場合は (何らかの形式の) 例外をスローします。activityOnHeadlineSelectedListener

構文は次のとおりです。

variable = (Type) variableOfType2;
于 2012-10-30T18:57:25.263 に答える