如何使方法接受包含任何数据类型的对象的List

时间:2015-07-29 06:44:30

标签: java

我的目标是检查messages的类型,然后相应地将它们转换为字符串并添加它们。我怎样才能做到这一点?

public void addMessages(List<?> messages) {
    if (messages != null) {
        if (messages instanceof String) {
            for (String message : messages) {
                this.messages.add(message);
            }
        }
    }

    else {
        for (Object message:messages) {
            this.messages.add(String.valueOf(message));
        }
    }
}

4 个答案:

答案 0 :(得分:3)

你可以传入一个对象列表 - 你甚至不需要if / else,因为你总是可以在消息对象上调用“toString()”或“String.valueOf”:

public void addMessages(List<Object> messages) {
    if (!CollectionUtils.isEmpty(messages)) {
        for (Object message : messages) {
            this.messages.add(String.valueOf(message));
        }
    }
}

旁注:消息列表中包含null元素可能会出现潜在问题 - 因此您可能希望在循环中检查该元素。其他潜在的陷阱是:

  • this.messages未初始化,添加邮件会引发NullPointerException
  • 如果这是一个单例的方法(例如弹簧服务),应该避免使用实例变量

答案 1 :(得分:2)

public void addMessages(List<Object> messages) {

这就足以让messages持有所有类型的对象。

答案 2 :(得分:1)

您可以使用&#34; Java Generics&#34;。

实现这一目标

在下面的main方法中初始化的Messages对象将接受任何类型的对象列表。您也可以使用特定类型初始化Messages对象。

public class Messages<T> {

    private List<T> messages = new ArrayList<T>();

    public void addMessages(List<T> messages) {
        for (T message : messages) {
            // Use String.valueOf or message.toString() 
            // if you would like to convert the objects to String.
        }
    }

    public static void main(String[] args) {
        Messages<Object> msg = new Messages<Object>();
        msg.addMessages(/** Your List of objects of any type **/);
    }

}

答案 3 :(得分:0)

这只是对nutfox答案的改进。

public void addMessages(List<?> messages) {
        List<String> collect = messages.stream().map(i -> String.valueOf(i)).collect(Collectors.toList());
        this.messages.addAll(collect);
}