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

发布于 2024-11-29 12:02:11 字数 851 浏览 3 评论 0原文

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

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(Listlst) 。我该怎么做?

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

    }    
}

I have the following class which stores a list of object arrays.

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

When I call the following, the overloaded method addList(Object... obj) is called but I want the addList(List<Object> lst) to be called. How can I do this?

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

    }    
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

白昼 2024-12-06 12:02:11

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

    } 
}

Change List<Object> to List<?> to capture lists of any type of object. I tried this and it printed "in 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);

    } 
}
那请放手 2024-12-06 12:02:11

这是Java泛型的问题。您不能将 List 分配给 List

另请参阅:带有通用列表的 Java 参考分配

It's problem of Java Generic. You cannot assign List<String> to List<Object>.

See also: Java Reference assignment with generic lists

眼趣 2024-12-06 12:02:11

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

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

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

Rewrite the type of you non-variadic method to use a wildcard:

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

Then List<String> will be a subtype of the parameter type.

荆棘i 2024-12-06 12:02:11

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

List<String> is not a subclass of List<Object>. So that overload will never be called, even if you remove the ... variant.

倾其所爱 2024-12-06 12:02:11

将您的方法更改为

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

Change your method to

public void addList(List<?> lst) {
    list.add(lst.toArray());
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文