Почему Java не вызывает метод (List <Object>), если у меня есть (Object ...)? - PullRequest
11 голосов
/ 15 августа 2011

У меня есть следующий класс, в котором хранится список массивов объектов.

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);

    }    
}

Ответы [ 5 ]

8 голосов
/ 15 августа 2011

Измените 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);

    } 
}
7 голосов
/ 15 августа 2011

Это проблема Java Generic. Вы не можете назначить List<String> на List<Object>.

См. Также: Назначение Java-ссылки со стандартными списками

7 голосов
/ 15 августа 2011

Перепишите тип вашего невариантного метода, чтобы использовать подстановочный знак:

public void addList(List<?> lst) {
    list.add(lst.toArray());
}

Тогда List<String> будет подтипом типа параметра.

6 голосов
/ 15 августа 2011

List<String> не является подклассом List<Object>.Так что перегрузка никогда не будет вызвана, даже если вы удалите вариант ....

2 голосов
/ 15 августа 2011

Измените свой метод на

public void addList(List<?> lst) {
    list.add(lst.toArray());
}
...