【发布时间】:2012-05-17 19:25:35
【问题描述】:
我试图了解 java 如何处理函数调用中的歧义。在下面的代码中,对method 的调用是模棱两可的,但method2 不是!!!。
我觉得两者都模棱两可,但是为什么当我注释掉对method 的调用时会编译?为什么method2 也没有歧义?
public class A {
public static <K> List<K> method(final K arg, final Object... otherArgs) {
System.out.println("I'm in one");
return new ArrayList<K>();
}
public static <K> List<K> method(final Object... otherArgs) {
System.out.println("I'm in two");
return new ArrayList<K>();
}
public static <K, V> Map<K, V> method2(final K k0, final V v0, final Object... keysAndValues) {
System.out.println("I'm in one");
return new HashMap<K,V> ();
}
public static <K, V> Map<K, V> method2(final Object... keysAndValues) {
System.out.println("I'm in two");
return new HashMap<K,V>();
}
public static void main(String[] args) {
Map<String, Integer> c = A.method2( "ACD", new Integer(4), "DFAD" );
//List<Integer> d = A.method(1, "2", 3 );
}
}
编辑: 这出现在 cmets 中:到目前为止,许多 IDE 都报告为模棱两可 - IntelliJ 和 Netbeans。但是,它可以从命令行/maven 编译。
【问题讨论】:
-
这真的会伤到你的头,但是,这是规范中的规则:docs.oracle.com/javase/specs/jls/se5.0/html/… - 我怀疑使用两个通用参数
method2可以说是“严格来说更多具体” - 我让你在那里做数学,我在吃午饭:-D -
对于
javac 1.7.0_02,它无法编译,即使从命令行,method2也被认为是模棱两可的。 -
有趣的是,Java 7 中的编译行为有所不同。粗略一看,The spec 看起来很相似。
-
感谢 @alain.janinm 我认为 JDK6 中存在错误。根据oracle.com/technetwork/java/javase/…,一些与模糊调用相关的错误已在 Java 7 中得到解决。我找不到这种特殊情况。
-
可能,此外,根据 varargs doc
you should not overload a varargs method, or it will be difficult for programmers to figure out which overloading gets called.但是了解“最具体方法”的分辨率如何工作很有趣。如果您需要一些帮助来理解规范,您可以阅读 stackoverflow.com/q/6023439/1140748 以及一个很好解释的示例 forums.oracle.com/forums/message.jspa?messageID=9485871#9485871。
标签: java generics variadic-functions