【问题标题】:To accept a String in an ArrayList in java as ReturnType在 java 中接受 ArrayList 中的字符串作为 ReturnType
【发布时间】:2019-09-17 23:59:06
【问题描述】:

我在类 XYZ 中有一个名为 abc 的变量。 该变量的返回类型是 List,但之前它的返回类型是 String。所以,现在当一个列表作为输入出现时,它会被处理,但当一个字符串出现时,它会抛出异常。 需要使其与数据类型 List 和 String 兼容。 请帮忙

private List<String> abc;

public List<String> getAbc() {
    return abc;
}

public void setAbc(List<String> abc) {
    this.abc = abc;
}

【问题讨论】:

  • 一个变量不能有两种不同的类型。您可以定义第二个变量并重载您的方法 setAbc(String s),然后将传递的字符串分配给另一个局部变量
  • 哪一行导致异常?
  • 您可能需要提供另一个 setter,可能是 public void setAbc(String abc) { this.abc = new ArrayList&lt;String&gt;(abc); } 或类似...
  • 所有关于重载的评论都是有效的,但您也可以将 String 的可变参数作为您唯一的 setter 版本,并在 setter 内部处理单个或多个项目列表的转换。跨度>

标签: java string arraylist


【解决方案1】:

如果您只需要相同的方法名称,则可以这样做:

public void setAbc(List<String> list) {
    this.abc = list;
}

public void setAbc(String str) {
    if (this.abc == null) {
        this.abc = new ArrayList<>();
    }
    this.abc.add(str);
}

您要追加到此列表还是仅在输入时创建一个新列表?这个附加到列表中。

【讨论】:

    【解决方案2】:

    您要查找的概念是method overloading

    一个方法是由它的名字和它的所有参数定义的,所以你可以像这样定义两个不同的方法:

    public void setAbc(List<String> abc) {
        this.abc = abc;
    }
    
    public void setAbc(String abc) {
        // Collections.singletonList creates an *immutable* list
        // See: https://docs.oracle.com/javase/10/docs/api/java/util/Collections.html#singletonList(T)
        this.abc = Collections.singletonList(abc);
    }
    
    

    【讨论】:

    • 使用Collections.singletonList时要小心。由于其不变性,您将无法将任何元素添加到此列表中。所以object.getAbc().add("def"); 会抛出一个错误。根据 OP 的要求,最好将其包装在数组列表中。
    • @Abrikot 另一方面,让getAbc() 返回一个不可变的列表可能是件好事,并有不同的方法setAbc()addToAbc()、removeFromAbc()` 等。参见例如refactoring.guru/encapsulate-collection
    • @DodgyCodeException > 当然可以!这真的取决于OP想要什么。对于使用此工作解决方案并遇到异常的任何人来说,这只不过是一个警告。
    • 你是对的,我用它作为例子,因为我不能真正说这个方法使用 OP。不过,我会添加一个关于其不变性的警告
    【解决方案3】:
    private List<String> abc;
    
    public List<String> getAbc() {
        return abc;
    }
    
    public void setAbc(List<String> abc) {
        this.abc = abc;
    }
    
    public void setAbc(String newItem) {
        if (this.abc == null) {
            this.abc = new java.util.ArrayList<>();
        }
        this.abc.add(newItem);
    }
    

    您添加一个新方法并附加到列表中。正如 ItFreak 所述,这称为重载。

    【讨论】:

      【解决方案4】:

      如何按照@ItFreak 对String 的重载方法的建议将String 设置为List。 除非它不起作用

      【讨论】:

        猜你喜欢
        • 2015-05-27
        • 1970-01-01
        • 1970-01-01
        • 2016-07-18
        • 2016-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-26
        相关资源
        最近更新 更多