假设我在类中定义了两个方法,如下所示
public void m(final Serializable s){
System.out.println("method 1");
}
public void m(final String s){
System.out.println("method 2");
}
如果我有一个变量定义为
final Serializable s = "hello world";
如何使用此变量调用 m,以便在控制台上打印"方法 2"?我试过了
m(s.getClass().cast(s));
但仍然调用方法 1,但根据我的观察,上面的代码确实将 s 转换为字符串类型。
你的变量s
是Serializable
的类型,但实际上它指向一个String
对象(因为文字"hello world"
给你一个该类型的对象(,所以它可以被强制转换为(String)
。
重载的方法调用在编译时使用可用的最具体类型(在编译时已知(解析;您在这里所做的是尝试使用运行时已知的最具体的类型进行解析。
在Java中,你可以使用Visiter模式来做到这一点(但不幸的是你不能扩展String
;如果你声明自己的类型,你可以(。
试试这个:
if (s instanceof String)
m((String)s);
else
m(s);
您可以通过多种方式将其转换为字符串,例如:
m((String) s);
或:
m(s.toString());
或者你可以用 s 初始化一个 String 变量,并用它调用该方法,如下所示:
String invoker = "" + s;
m(invoker);