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();