Java 在不知道对象的类类型的情况下对对象调用方法

Java 在不知道对象的类类型的情况下对对象调用方法,java,android,fragment,Java,Android,Fragment,我在android应用程序中使用Fragment。目前,我有两个片段以分割视图样式显示,让我们调用片段A和片段B。片段B经常更改,并且有许多不同类型的片段可以更改 我希望对片段B调用一个方法。这个方法存在于大多数但不是所有可以显示的片段类型中 以下是我所拥有的: FragmentManager fm = getSupportFragmentManager(); Fragment frag = fm.findFragmentByTag("ContentFrag"); if (frag != nul

我在android应用程序中使用Fragment。目前,我有两个片段以分割视图样式显示,让我们调用片段A和片段B。片段B经常更改,并且有许多不同类型的片段可以更改

我希望对片段B调用一个方法。这个方法存在于大多数但不是所有可以显示的片段类型中

以下是我所拥有的:

FragmentManager fm = getSupportFragmentManager();
Fragment frag = fm.findFragmentByTag("ContentFrag");
if (frag != null) {
    if (frag.getClass().equals(ExampleFragment1.class))
        ((ExampleFragment1)frag).refresh();
    else if (frag.getClass().equals(ExampleFragment2.class))
        ((ExampleFragment2)frag).refresh();
    else if (frag.getClass().equals(ExampleFragment3.class))
        ((ExampleFragment3)frag).refresh();
}
以下是我想要的:

FragmentManager fm = getSupportFragmentManager();
Fragment frag = fm.findFragmentByTag("ContentFrag");
if (frag != null) {
    frag.refresh();
}
有没有办法实现这一点,或者我必须写大量的if语句


谢谢

您可以使您的
片段
实现一个可刷新的
界面,您可以检查它

if(frag instanceof Refreshable)
    ((Refreshable)frag).refresh();
}

这并不漂亮,但比上面的代码更漂亮。

您可以使用instanceof关键字查看片段是否是这些特殊片段之一的实例。这种方法是否只存在于某些片段中?是您自己创建的还是API的一部分

如果是您自己制作的,则让这些片段实现一个名为RefreshableFragment的接口。此接口将包含所述方法,那么您只需执行以下操作:

if(frag!=null && frag instanceof RefreshableFragment)
    frag.refresh();

解决方案是创建名为RefreshableFragment的父类,该类具有refresh()方法:

所有片段类都应扩展该类:

public class ExampleFragment1 extends RefreshableFragment {

    public void refresh() {
       // implementation
    }

}
然后,您可以在代码中使用刷新的片段:

FragmentManager fm = getSupportFragmentManager();
RefreshableFragment frag = (RefreshableFragment)fm.findFragmentByTag("ContentFrag");
if (frag != null) {
    frag.refresh();
}

英雄所见略同:P看到你的回答让我意识到我忘记了演员阵容!主要的问题是,你不能用android框架进行推理,作为最后的手段,你必须做这样丑陋的事情。这就像是
Canvas
drawLine
方法,与大多数时候都有
moveTo
lineTo
方法的向量绘图库相比,这种方法是不合理的。
Fragment
是一个类而不是一个接口。我对你的一篇评论说,我所做的与我们的回答几乎相同时间…哦,我明白了。我没有注意到:)
FragmentManager fm = getSupportFragmentManager();
RefreshableFragment frag = (RefreshableFragment)fm.findFragmentByTag("ContentFrag");
if (frag != null) {
    frag.refresh();
}