【问题标题】:Java : passing parameter to same method signature except the parameter type [duplicate]Java:将参数传递给相同的方法签名,除了参数类型[重复]
【发布时间】:2015-11-30 14:44:12
【问题描述】:
public class Test{

public static void m1(Object o){
    System.out.println("object called");
}

public static void m1(String s){
    System.out.println("String called");
  } 
 }

现在,这里有以下案例,

  • m1("字符串"); 输出:字符串调用
  • m1(新字符串(“字符串”)); 输出:字符串调用
  • 对象o =“字符串”; m1(o); 输出:被调用的对象
  • 对象 o = new String("string"); m1(o); 输出:被调用的对象
  • 对象o =新对象(); m1(o); 输出:被调用的对象

有人可以解释一下上述情况吗?

【问题讨论】:

  • 每个变量o 都定义为Object,因此它调用m1(Object)。使用String 的呼叫也会发生同样的情况。
  • Object o = "string" 执行类型擦除,您已强制将String 视为通用Object。将o 传递给m1() 使用对象版本,因为这是变量o 的类型。

标签: java


【解决方案1】:

在编译时根据传入的表达式类型做出决定。所以

  • m1("string") 使用String 版本(因为字面量是String 类型)

  • m1(new String("string")) 使用 String 版本,因为表达式 new String("string") 的类型为 String

  • 所有三个m1(o) 都使用Object 版本,因为o 的类型是Object(根据声明)

再次强调,o 所指的具体类型无关紧要,它是编译器用来确定要调用哪个重载的 表达式 的静态类型。

这意味着如果你改变表达式的类型,你可以让编译器做出不同的选择:

Object o = "string";
m1((String)o); // Calls the String version

JLS 有一整节专门用于方法调用表达式:§15.12: Method Invocation Expressions。相关小节是§15.12.2: Compile-Time Step 2: Determine Method Signature

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 2013-10-04
    • 1970-01-01
    • 2017-11-22
    • 2015-12-26
    • 2021-09-05
    • 2012-01-11
    相关资源
    最近更新 更多