Рассмотрим следующий код:
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....
Может кто-нибудь объяснить это странное поведение?