Activity是MainFragmentListener的一个实例,是真的吗?

时间:2018-05-27 13:38:30

标签: java android oop inheritance instanceof

我在想,怎么可能。
我有MainActivty和MainFragment with listener:MainFragmentListener 当然,我在MainActivity中实现了这个监听器作为接口 现在我想了解这个:

if (context instanceof MainFragmentListener)

总是如此,怎么可能? MainActivity不是MainFragmentListener的实例 MainFragmentListener是一个公正的界面,而不是对象!

MainFragment:

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof MainFragmentListener) {
        mListener = (MainFragment.MainFragmentListener) context;
    } else {
        throw new RuntimeException(context.toString()
                + " must implement OnFragmentInteractionListener");
    }
}

public interface MainFragmentListener {
    void xx();
    void yy();
}

活性:

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener,
        MainFragment.MainFragmentListener{  

public void xx(){
     abc
 };
public void yy(){
abc2
 };

}

2 个答案:

答案 0 :(得分:1)

这是因为instanceof还检查类是否实现了接口。您可以阅读documentation

  

instanceof运算符将对象与指定类型进行比较。您   可以使用它来测试对象是否是类的实例,实例   子类的实现,或实现特定的类的实例   接口

虽然我认为instanceof运营商名称有点误导。

答案 1 :(得分:0)

  

层次结构中的活动高于片段接口

所以?假设片段已分配给MainActivity,则context instanceof对于

将为真
  • 班级本身 - MainActivity。
  • 您在该类上定义的任何接口(无论在何处写入接口的定义)
    • NavigationView.OnNavigationItemSelectedListener
    • MainFragment.MainFragmentListener

以及每个班级和界面 in the hierarchy

public class AppCompatActivity extends FragmentActivity implements AppCompatCallback, TaskStackBuilder.SupportParentable, ActionBarDrawerToggle.DelegateProvider

java.lang.Object
   ↳    android.content.Context
       ↳    android.content.ContextWrapper
           ↳    android.view.ContextThemeWrapper
               ↳    android.app.Activity
                   ↳    android.support.v4.app.FragmentActivity