如果我有一个(Object ...)方法,为什么Java不会调用(List <Object>)方法呢?

Wil*_*ill 11 java overloading variadic-functions

我有以下类存储对象数组列表.

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

当我调用以下内容时,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);

    }    
}
Run Code Online (Sandbox Code Playgroud)

Dat*_*jam 8

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

    } 
}
Run Code Online (Sandbox Code Playgroud)


use*_*421 7

这是Java Generic的问题.你不能分配List<String>List<Object>.

另请参见:带有通用列表的Java引用分配


Hen*_*olm 7

重写非变量方法的类型以使用通配符:

public void addList(List<?> lst) {
    list.add(lst.toArray());
}
Run Code Online (Sandbox Code Playgroud)

然后List<String>将是参数类型的子类型.


Oli*_*rth 6

List<String>不是的子类List<Object>.因此,即使您删除了...变体,也永远不会调用重载.