Java 类即使在开关块中实例化,也只能调用接口方法

Java 类即使在开关块中实例化,也只能调用接口方法,java,interface,switch-statement,instantiation,cannot-find-symbol,Java,Interface,Switch Statement,Instantiation,Cannot Find Symbol,类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"

类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;
Switch (type) {
   case "A":
      obj.callMe();
      break;
   case "B":
      obj.writeMe();;
      break;
   case "C":
      obj.speakMe();
      break;

现在,基于这个块,我假设obj将被实例化为三个选项之一,因为没有其他选项。我现在有另一个开关块,它试图调用特定的方法。在本例中,假设ClassA有一个方法callMe,classB有一个方法writeMe,classC有一个方法speakMe。但这两个都没有在接口名称中定义。我的下一个代码块如下所示:

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;
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,但是,我的开关块不应该有一些效果吗


我还尝试在实例化了同一开关块之后,调用该开关块中的方法。我收到了相同的错误。

您需要使用包含该方法的实际类强制转换obj变量

((ActualClass) obj).writeMe();

唯一重要的是
obj
的声明类型是
InterfaceName
。Java没有“智能铸造”。啊,所以本质上我必须声明3个不同的OBJ作为它们的主要类,然后调用每个OBJ的特定方法@板条