Преобразование ArrayList перечислений в String - PullRequest
0 голосов
/ 17 октября 2018

У меня есть следующие enum s, которые могут заполнить ArrayList:

public enum RewardType {
    POINTS, MONEY, TOKENS, RANDOM;
}

и

public enum OfferType {
    GIFT, DISCOUNT, LOTTERY;
}

Для преобразования ArrayList в String Iиспользуйте этот метод:

public static String arrayListToString(ArrayList<Enum> arrayList) {
    String finalString = "";
    for (int i = 0; i < arrayList.size(); i++) {
        if (TextUtils.isEmpty(finalString)) {
            finalString = arrayList.get(i).name();
        } else {
            finalString = finalString + ", " + arrayList.get(i).name();
        }
    }
    return finalString;
}

и затем я называю его так:

String rewardType = arrayListToString(mainModel.getRewardTypes()); 
//getRewardTypes returns an ArrayList<RewardType>

Проблема в том, что arrayListToString вызывается с ArrayList<Enum> и не может вызываться с ArrayList<enum> параметр (который является типом моих классов).Я также не могу создать класс с типом Enumenum! = Enum, как мне заставить метод arrayListToString работать с моими enum классами?

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

Поскольку enum X неявно является подклассом Enum<X>, измените объявление метода на:

public static String arrayListToString(ArrayList<? extends Enum> arrayList)

Однако, почему это так?

toString() перечислениявозвращает name() по умолчанию, поэтому вам не нужно вызывать name(), что означает, что вам больше неважно, что находится в списке, так что этот гораздо более полезный метод также будет работать:

public static String listToString(List<?> list) {
    StringBuilder buf = new StringBuilder();
    boolean first = true;
    for (Object value : list) {
        if (first)
            first = false;
        else
            buf.append(", ");
        buf.append(value);
    }
    return buf.toString();
}

Это может быть даже проще, чем это:

public static String toString(Iterable<?> iterable) {
    StringJoiner joiner = new StringJoiner(", ");
    for (Object value : iterable)
        joiner.add(String.valueOf(value));
    return joiner.toString();
}

Или с потоками Java 8+:

public static String toString(Collection<?> coll) {
    return coll.stream().map(Object::toString).collect(Collectors.joining(", "));
}
0 голосов
/ 17 октября 2018

Как уже упоминал Бен, вам следует использовать обобщенные типы для правильной оценки типа.

Кроме того, ваш метод немного неоптимизирован.Попробуйте использовать StringBuilder для предотвращения создания мусора String объектов и убрать лишнюю проверку isEmpty внутри цикла:

public static <T extends Enum<?>> String enumListToString(List<T> list){
    if(list.size() < 1)
        return "";
    StringBuilder sb = new StringBuilder();
    sb.append(list.get(0).name());
    for (int i = 1; i < list.size(); i++) {
        sb.append(", ").append(list.get(i));
    }
    return sb.toString();
}
0 голосов
/ 17 октября 2018

Измените подпись arrayListToString() с этого:

public static String arrayListToString(ArrayList<Enum> arrayList)

на это:

public static String arrayListToString(ArrayList<? extends Enum> arrayList)

Основная концепция игры заключается в том, чтоList<Integer> это , а не a List<Number>, хотя Integer это Number.Это имеет смысл, потому что вы можете поместить Double в List<Number>, но вы не можете поместить Double в List<Integer>.

Аналогично, List<RewardType> не является List<Enum>хотя RewardType - это Enum.

А List<RewardType> - , а List<? extends Enum>.Это потому, что мы сейчас говорим, что список - это список какого-либо перечисления , а не список любого перечисления когда-либо .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...