【发布时间】:2013-08-29 21:27:07
【问题描述】:
考虑以下代码:
public class Converter {
public <K> MyContainer<K> pack(K key, String[] values) {
return new MyContainer<>(key);
}
public MyContainer<IntWrapper> pack(int key, String[] values) {
return new MyContainer<>(new IntWrapper(key));
}
public static final class MyContainer<T> {
public MyContainer(T object) { }
}
public static final class IntWrapper {
public IntWrapper(int i) { }
}
public static void main(String[] args) {
Converter converter = new Converter();
MyContainer<IntWrapper> test = converter.pack(1, new String[]{"Test", "Test2"});
}
}
上面的代码编译没有问题。但是,如果将pack 签名和new String[]{"Test", "Test2"} 中的String[] 更改为String... 到"Test", "Test2",则编译器会抱怨对converter.pack 的调用不明确。
现在,我可以理解为什么它会被认为是模棱两可的(因为int 可以自动装箱为Integer,从而匹配K 的条件或缺少条件)。但是,我无法理解的是,如果您使用 String[] 而不是 String...,为什么不存在歧义。
有人能解释一下这种奇怪的行为吗?
【问题讨论】:
-
以前也有类似的问题,但我承认它们有点特别,很难找到。尽管如此,还是让人联想到! : S
-
这个语法糖时不时让你发痒,你所能做的就是阅读 JLS 并等待答案!
-
语法糖与否,我仍然希望它与语言的其余部分保持一致。
-
这真是一个很好的问题。很难得到真正的答案。
-
最令人惊讶的行为是第一个方法根本不适用于该方法调用,因为
1不能通过方法调用转换转换为IntWrapper。这真的在吃我的头。仍在 JLS 周围漫游。
标签: java generics overloading variadic-functions