Почему Java не вызывает метод (List <Object>), если у меня есть (Object...) один?
У меня есть следующий класс, который хранит список массивов объектов.
public class Test {
private List<Object[]> list = new ArrayList<Object[]>();
public void addList(Object... obj) {
list.add(obj);
}
public void addList(List<Object> lst) {
list.add(lst.toArray());
}
}
Когда я вызываю следующее, вызывается перегруженный метод addList(Object... obj)
, но я хочу, чтобы вызывал addList(List<Object> lst)
. Как я могу это сделать?
public class Main {
public static void main(String[] args) {
Test testObj = new Test();
List<String> myStrings = new ArrayList<String>();
myStrings.add("string 1");
myStrings.add("string 2");
myStrings.add("string 3");
// The variable argument method is called but this is a list!
testObj.addList(myStrings);
}
}
Ответы
Ответ 1
Измените List<Object>
на List<?>
, чтобы записывать списки любого типа объектов. Я попробовал это, и он напечатал "в списке":
import java.util.ArrayList;
import java.util.List;
public class Test {
private List<Object[]> list = new ArrayList<Object[]>();
public void addList(Object... obj) {
System.out.println("in object");
list.add(obj);
}
public void addList(List<?> lst) {
System.out.println("in List<?>");
list.add(lst.toArray());
}
public static void main(String[] args) {
Test testObj = new Test();
List<String> myStrings = new ArrayList<String>();
myStrings.add("string 1");
myStrings.add("string 2");
myStrings.add("string 3");
// The variable argument method is called but this is a list!
testObj.addList(myStrings);
}
}
Ответ 2
Это проблема Java Generic. Вы не можете назначить List<String>
List<Object>
.
См. также: Назначение ссылок Java с общими списками
Ответ 3
Перепишите тип вашего невариантного метода для использования шаблона:
public void addList(List<?> lst) {
list.add(lst.toArray());
}
Тогда List<String>
будет подтипом типа параметра.
Ответ 4
List<String>
не является подклассом List<Object>
. Так что перегрузка никогда не будет вызвана, даже если вы удалите вариант ...
.
Ответ 5
Измените свой метод на
public void addList(List<?> lst) {
list.add(lst.toArray());
}