Class 尽管在 switch 块中实例化,但只能调用接口方法
Class can only call interface methods despite being instantiated in switch block
类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 有一个方法 speakMe。但是这些都没有在接口 InterfaceName 中定义。我的下一个代码块如下所示:
Switch (type) {
case "A":
obj.callMe();
break;
case "B":
obj.writeMe();;
break;
case "C":
obj.speakMe();
break;
我的 IDE、intelliJ 以红色突出显示所有这些方法,并且 java 在编译后给我一个错误 "cannot find symbol"。
我试过使用 if-else 块,但没有任何效果。看起来 java 只允许 obj 在接口中调用方法,而不是在任何实现它的类中。我的猜测是因为它被声明为 InterfaceName,但是,我的开关块不应该有一些效果吗?
我还尝试在实例化后立即调用同一个开关块中的方法。我收到了同样的错误。
您需要使用包含该方法的实际 class 转换 obj 变量。
((ActualClass) obj).writeMe();
类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 有一个方法 speakMe。但是这些都没有在接口 InterfaceName 中定义。我的下一个代码块如下所示:
Switch (type) {
case "A":
obj.callMe();
break;
case "B":
obj.writeMe();;
break;
case "C":
obj.speakMe();
break;
我的 IDE、intelliJ 以红色突出显示所有这些方法,并且 java 在编译后给我一个错误 "cannot find symbol"。
我试过使用 if-else 块,但没有任何效果。看起来 java 只允许 obj 在接口中调用方法,而不是在任何实现它的类中。我的猜测是因为它被声明为 InterfaceName,但是,我的开关块不应该有一些效果吗?
我还尝试在实例化后立即调用同一个开关块中的方法。我收到了同样的错误。
您需要使用包含该方法的实际 class 转换 obj 变量。
((ActualClass) obj).writeMe();