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

时间:2011-08-15 12:37:39

标签: 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());
    }
}

当我调用以下内容时,会调用重载的方法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 个答案:

答案 0 :(得分:8)

List<Object>更改为List<?>以捕获任何类型对象的列表。我试过这个并打印在“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);

    } 
}

答案 1 :(得分:7)

这是Java Generic的问题。您无法将List<String>分配给List<Object>

另请参阅:Java Reference assignment with generic lists

答案 2 :(得分:7)

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

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

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

答案 3 :(得分:6)

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

答案 4 :(得分:2)

将您的方法更改为

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