Почему я должен понижать контекст как экземпляр интерфейса?

Я только начал изучать API фрагментов на Android. Я просто хочу отправить сообщение обратно в свою активность (я это сделал). Теперь я хочу прояснить недоразумение по поводу понижения.

Вот мой фрагмент:

import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;

public class DetailFragment extends Fragment {

private EditText textFirstName, textLastName, textAge;
private FragmentListener mListener;

public DetailFragment() {
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);

    if (!(context instanceof FragmentListener)) throw new AssertionError();
    mListener = (FragmentListener) context;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_detail, container, false);

    textFirstName = (EditText) rootView.findViewById(R.id.textFirstName);
    textLastName = (EditText) rootView.findViewById(R.id.textLastName);
    textAge = (EditText) rootView.findViewById(R.id.textAge);

    Button doneButton = (Button) rootView.findViewById(R.id.done_button);
    doneButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            done();
        }
    });
    return rootView;
}

private void done() {
    if (mListener == null) {
        throw new AssertionError();
    }

    String firstName = textFirstName.getText().toString();
    String lastName = textLastName.getText().toString();
    int age = Integer.valueOf(textAge.getText().toString());

    mListener.onFragmentFinish(firstName, lastName, age);
}

public interface FragmentListener {
    void onFragmentFinish(String firstName, String lastName, int age);
}

}

Я не понимаю здесь понижения:

mListener = (FragmentListener) context;

Как класс Context соотносится с моим интерфейсом FragmentListener?

Я считаю, что это противоречит моим знаниям о понижающем преобразовании (понижающее приведение - это приведение к подтипу, вниз к дереву наследования).

1
0
46
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Два типа, Context и FragmentListener, не связаны между собой. Однако подкласс Context может реализовывать интерфейс FragmentListener. Ваш метод onAttach() проверяет, что это действительно происходит, и выполняет понижающее преобразование, поэтому функциональность FragmentListener доступна через поле члена mListener.

Любой Context (скорее всего, Activity), который присоединяет экземпляр DetailFragment, должен будет реализовать DetailFragment.FragmentListener, чтобы избежать AssertionError во время выполнения.

Другие вопросы по теме