Почему 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);

    } 
}

Ответ 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());
}