Рассмотрим следующий код:
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"});
}
}
Вышеприведенный код компилируется без проблем. Однако, если вы меняете String[]
на String...
в обеих подписях pack
и new String[]{"Test", "Test2"}
до "Test", "Test2"
, компилятор жалуется на то, что вызов converter.pack
был неоднозначным.
Теперь я могу понять, почему его можно считать двусмысленным (поскольку int
может быть автобоксирован в Integer
, что соответствует условиям или их отсутствию K
). Однако я не могу понять, почему двусмысленность не существует, если вы используете String[]
вместо String...
.
Может кто-нибудь объяснить это странное поведение?