【问题标题】:Elegant way of specifying either objects or enums as a parameter将对象或枚举指定为参数的优雅方式
【发布时间】:2013-12-20 09:42:59
【问题描述】:

我编写了以下代码来将ArrayList(例如值"Cat", "Dog", "Fish")转换为人类可读的字符串(例如"Cat,Dog,Fish"),这是一项简单的任务,但我想优雅地扩展它。到目前为止,我得到的是:

public static String makeStringList(Iterable<String> items) {
    StringBuilder sb = new StringBuilder();
    for (String item : items) {
        sb.append(item);
        sb.append(",");
    }
    if (sb.length() > 0) {
        sb.deleteCharAt(sb.length() - 1);
    }
    return sb.toString();
}

但我有另一个对象是 ArrayListEnum 值,比如说:

enum Animal {

    cat("Cat"),
    dog("Dog"),
    fish("Fish");

    String value;

    Animal(String num) {
        value = num;
    }

}

还有一个包含(Animal.cat, Animal.dog, Animal.fish)ArrayList&lt;Animal&gt;

扩展我的makeStringList 函数以使其接受ArrayLists 或Enums 或Strings 的最佳方法是什么?我尝试将参数更改为Iterable&lt;Object&gt; items 并使用toString(),但显然我的枚举没有扩展Object,所以没有toString()。我还尝试使用函数getStringRepresentation 创建一个接口hasStringRepresentation,它很好用,但不适用于字符串。

有没有一种优雅的方法可以扩展 makeStringList 函数以接受对象或枚举?显而易见的答案是重载 makeStringList 但我想将问题限制为不涉及重载的答案。

【问题讨论】:

    标签: java enums polymorphism superclass


    【解决方案1】:

    枚举确实有toString 方法。您可以根据需要覆盖它。您必须在函数参数中使用 Iterable&lt;?&gt; 而不是 Iterable&lt;Object&gt; 才能允许 Object 以外的其他类型。在集合中使用泛型总是令人困惑。

    【讨论】:

    • 这就是我所追求的,我不知道 Iterable> 存在 - 完全符合要求 :)
    【解决方案2】:

    我尝试将参数更改为Iterable&lt;Object&gt; 项目并使用toString(),但显然我的枚举没有扩展Object 所以没有toString()

    枚举不能扩展Object,因为Java 中的所有枚举都扩展java.lang.Enum&lt;T&gt;,后者扩展了对象。您需要做的就是在您的实现中覆盖toString,如下所示:

    @Override
    public String toString() {
        return value;
    }
    

    【讨论】:

    • 我试过了,但 Netbeans 不允许我使用枚举的 ArrayList 作为 Iterable - 我没有意识到我需要 Iterable>
    • @MattLyons 我没有意识到您试图将Iterable&lt;SomeType&gt; 传递给采用Iterable&lt;Object&gt; 的参数。你不能这样做 - 有或没有枚举。为此,您需要通配符。
    • 是的,我使用 Iterable 来表示扩展对象的类的可迭代对象,而没有意识到它代表完全不同的类型。
    猜你喜欢
    • 2012-11-04
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多