【发布时间】:2015-03-19 22:53:03
【问题描述】:
为什么可以编译具有相同签名的两个方法的类?
“foo”方法只有不同的返回类型。
但是返回类型不是 java 中方法签名的一部分。
java编译器在这种情况下会创建桥接方法吗?
如果是 - 真实的代码会是什么样子?
对于 foo 方法有以下警告:
方法 foo(GenClass) 具有相同的擦除 foo(GenClass) 类型测试中的另一种方法
如果取消注释bar方法,bar方法会出现以下错误:
方法 bar(GenClass) 具有相同的擦除条(GenClass) 类型测试中的另一种方法
class GenClass<T> {
}
public class test {
public static void main(String[] args) {
}
public static Integer foo(GenClass<Integer> criteria) {
System.out.println("Integer");
return null;
}
public static String foo(GenClass<String> criteria) {
System.out.println("String");
return null;
}
/*public static void bar(GenClass<Integer> criteria) {
System.out.println("Integer");
}
public static void bar(GenClass<String> criteria) {
System.out.println("String");
}*/
}
D:\tools\java\jdk1.6.0_37_32\bin>java -version
java版本“1.6.0_38”
Java(TM) SE 运行时环境(内部版本 1.6.0_38-b05)
Java HotSpot(TM) 64 位服务器 VM(内部版本 20.13-b02,混合模式)
【问题讨论】:
-
对我来说不可能编译你的代码。
Error:(33, 19) java: name clash: foo(designPatterns.singleton.GenClass<java.lang.String>) and foo(designPatterns.singleton.GenClass<java.lang.Integer>) have the same erasure -
是的,有可能……
-
此代码不能使用 JDK7 或 JDK8 编译。但是,在旧版本中,它只会生成警告。
-
这绝对和bridge methods无关。