Consider the following code:
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
签名中的String[]
改为String...
,并将new String[]{"Test", "Test2"}
改为"Test", "Test2"
,编译器会抱怨对converter.pack
的调用存在歧义。我能理解为什么这可能被认为是有歧义的(因为
int
可以自动装箱为Integer
,从而符合条件,或者缺乏条件,即K
)。然而,我无法理解的是,如果使用String[]
而不是String...
,为什么就没有歧义。请问有人能够解释这种奇怪的行为吗?
K
的类型。因此,正如赋值所示,K
应该被推断为IntWrapper
。 - Rohit Jain