类A,B和C都实现InterfaceName,并且还包括它们自己的未在接口中定义的特定方法。
我有看起来像这样的代码:
InterfaceName obj = null;
// initial type, can change
String type = "A"
Switch (type) {
case "A":
obj = ClassA();
break;
case "B":
obj = ClassB();
break;
case "C":
obj = ClassC();
break;
现在,基于此块,我假设将obj实例化为三个对象之一,因为没有其他选择。我现在有另一个尝试调用特定方法的开关块。在此示例中,假设ClassA具有方法callMe,classB具有方法writeMe,而classC具有方法sayMe。但是这些都不在接口InterfaceName中定义。我的下一个代码块如下所示:
Switch (type) {
case "A":
obj.callMe();
break;
case "B":
obj.writeMe();;
break;
case "C":
obj.speakMe();
break;
我的IDE intelliJ用红色突出显示了所有这些方法,并且Java在编译后给我一个错误“找不到符号”。
我尝试使用if-else块代替,但是没有任何效果。看起来Java仅允许obj调用接口中的方法,而不允许在实现它的任何类中调用方法。我的猜测是因为它被声明为InterfaceName,但是仍然,我的开关块不应该起作用吗?
我还试图在实例化它之后立即在同一个switch块中调用方法。我收到了同样的错误。
您需要使用包含该方法的实际类来强制转换obj变量。
((ActualClass) obj).writeMe();