指定对象或枚举作为参数的优雅方式

时间:2013-12-04 03:35:52

标签: java enums polymorphism superclass

我已经使用以下代码将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();
}

但是我有另一个ArrayList Enum个{I}}值的对象,比如说:

enum Animal {

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

    String value;

    Animal(String num) {
        value = num;
    }

}

包含ArrayList<Animal>的{​​{1}}。

扩展(Animal.cat, Animal.dog, Animal.fish)功能的最佳方式是什么,以便它接受makeStringListArrayList的{​​{1}}个?我已尝试将参数更改为Enum并使用String,但显然我的枚举不会延伸Iterable<Object> items,因此没有toString()。我还尝试使用函数Object创建一个接口toString(),该接口效果很好但不适用于字符串。

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

  

我已尝试将参数更改为Iterable<Object>项并使用toString(),但显然我的枚举不会延伸Object所以没有toString()

枚举不能扩展Object,因为Java中的所有枚举扩展java.lang.Enum<T>,它扩展了对象。您需要做的就是覆盖实现中的toString,如下所示:

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