很抱歉,我的问题没有任何意义。我将在这里尝试解释。假设我有一个像这样的基本接口:
public interface SimpleInterface {
public void function1();
}
和扩展接口如下:
public interface ExtendedInterface extends SimpleInterface{
public void function2();
}
可以说我有一个实现ExtendedInterface
的类:
public class Implementation implements ExtendedInterface {
@Override
public void function1() {
System.out.println("function1");
}
@Override
public void function2() {
System.out.println("function2");
}
}
现在,当我获得以function2()
类实例化的基本接口(SimpleInterface
)时,有什么方法可以调用Implementation
,如下所示:
SimpleInterface simpleInterface = new Implementation();
我知道它违反了接口的目的,但是它将使我免于进行大量代码更改。
答案 0 :(得分:3)
基本上,您必须转换为ExtendedInterface
:
SimpleInterface simpleInterface = new Implementation();
ExtendedInterface extendedInterface = (ExtendedInterface) simpleInterface;
extendedInterface.function2();
当然,如果simpleInterface
所引用的对象不是实际上实现ExtendedInterface
,则转换将失败。这样做绝对是一种代码味道-它可能是您可以使用的最佳选择,但至少值得考虑其他选择。
答案 1 :(得分:1)
首先,您应该检查对象实例是否实际上是Implementation类的实现,因为可能有多个类正在实现此Interface。
您可以按照以下步骤进行操作:
//Somewhere in the code
SimpleInterface simpleInterface = new Implementation();
//Now with the variable you can check it as below
if(simpleInterface instanceof Implementation)
Implementation implemenation = (Implementation)simpleInterface;
implemenation.function2();
答案 2 :(得分:1)
可以调用的方法受左侧类型(SimpleInterface
)的限制,并且由于SimpleInterface
没有方法function2()
,因此无法调用function2()
在simpleInterface
对象上。
为此,请进行如下强制转换(具体是downcast):
ExtendedInterface extendedInterface = (ExtendedInterface) simpleInterface;
extendedInterface.function2();
或更简洁地说:
((ExtendedInterface) simpleInterface).function2()
答案 3 :(得分:0)
如其他人的建议那样,这是一个选择,但这并不是完全的证明。我们可以在这里使用反射
Method[] methods = simpleInterface.getClass().getDeclaredMethods();
for (Method method : methods) {
if (method.getName().equals("function2"))
try {
method.invoke(simpleInterface);
} catch (Exception e) {
e.printStackTrace();
}
}
使用上面的代码将确保在具有此方法的对象的引用上调用function2
方法