下传课程

时间:2017-11-15 05:52:52

标签: java polymorphism

我有一个SomeInterface并且我有许多实现此接口的类。所有这些类的someMethod()都没有被接口定义。

假设我有someVariable类型的变量SomeInterface,我想在其上调用someMethod()。一种方法是向SomeInterface投降SomeClass以实现SomeInterface,并在其上调用someMethod,如下所示:

((SomeClass) someVariable).someMethod()

但我不知道实现SomeInterface的哪个类存储在someVariable中。什么是调用方法的替代干净方法,该方法由底层类实现,但未由我编码的接口定义。

3 个答案:

答案 0 :(得分:1)

您可以使用反射来调用方法

public static void main(String[] args) {
        TestI t = new Test();
        Class c = t.getClass();

        try {
           Method m = c.getDeclaredMethod("someMethod");
            m.invoke(t);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

此处TestI是一个没有someMethod的界面。使用反射获取类的方法并在t中调用方法someMethod 对象

答案 1 :(得分:1)

您可以在致电someVariable之前检查SomeClass是否存储someMethod个实例

if (someVariable instanceof SomeClass) {
    ((SomeClass)someVariable).someMethod();
} else {
    // do something else
}

答案 2 :(得分:1)

最脏的解决方案是使用反射,使用instanceof稍微不那么脏,但仍然不是最佳的。最简单的解决方案是使用someMethod()创建另一个接口,并使类也实现该接口。然后你可以转换到该接口并调用该方法。

((SomeInterface) someVariable).someMethod();

这当然要求您能够修改有问题的类。