Методы Java могут возвратить Перечисление типа?

На моей работе включен параметр компилятора для обработки предупреждений как ошибок. Так, никакие предупреждения, или это не скомпилирует:)

7
задан Community 23 May 2017 в 12:16
поделиться

7 ответов

Думаю, вы правы, он сможет вернуть только null или Enum , объявленное где-то еще. Но вам не обязательно указывать это «что-то еще» во время компиляции.

  class EnumEnumerator<T extends Enum<T>> implements Iterable<T> {
    private final Class<T> enumClass;

    public EnumEnumerator(Class<T> enumClass) {
      this.enumClass = enumClass;
    }

    public Iterator<T> iterator() {
      T[] values = enumClass.getEnumConstants();
      return Arrays.asList(values).iterator();
    }
  }

Позже,

8
ответ дан 6 December 2019 в 10:01
поделиться

Вся суть того, как Java выполняет Enums, состоит в том, что они безопасны по типу - поэтому вы не вернете Enum (это было бы дважды плюс нехорошо), вместо этого вы возвращаете фактический тип, который вы определить (как «Костюм»), который действует как класс. Костюм имеет 4 «Перечисленных» экземпляра.

Если бы вы ожидали «Костюм», какой толк было бы вернуть «Ранг» равный 7? Это сломало бы все!

Также, если вы передали "Enum" или какое-нибудь общее значение, вы не могли бы вызывать для него методы. Самая крутая вещь в TypeSafe Enums - это то, что вы можете просто получить «Suit» и вызвать «Suit.getColor ()» и полностью рассчитывать на получение цвета этого костюма. У вас также может быть rankHigherThan (Suit s), который может соответствовать:

assertTrue(SPADES.ranksHigherThan(HEARTS));

Или, что более важно:

3
ответ дан 6 December 2019 в 10:01
поделиться

Все перечисления реализуют интерфейс Enum, поэтому вы, безусловно, можете написать метод который таким образом возвращает перечисление. Но этот метод вернет одно значение перечисления. Невозможно вернуть общее значение, которое охватывает все перечисление (кроме возврата класса и выполнения отражения). Однако вы можете вернуть все значения перечисления, которые, я думаю, более или менее соответствуют вашим требованиям.

enum Resources { ONE, TWO, THREE }
private Enum<?>[] resources() {
    return Resources.values();
}

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

enum Resources { ONE, TWO, THREE }
enum MoreResources { UN, DEUX, TROIS }
private Enum<?>[] resources() {
    List<Enum<?>> resources = new ArrayList<Enum<?>>();
    resources.addAll(Arrays.asList(Resources.values());
    resources.addAll(Arrays.asList(MoreResources.values());
    return resources.toList(new Enum<?>[] {});
}

Еще лучший подход, более безопасный для типов, - это иметь интересующие перечисления реализовать общий интерфейс, например

public interface Resources {}
enum SomeResources implements Resources { ONE, TWO, THREE }
enum MoreResources implements Resources { UN, DEUX, TROIS }
private Resources[] resources() {
    List<Resources> resources = new ArrayList<Resources>();
    resources.addAll(Arrays.asList(Resources.values());
    resources.addAll(Arrays.asList(MoreResources.values());
    return resources.toList(new Resources[] {});
}

Вы можете добавить к интерфейсу дополнительные методы для обеспечения большей функциональности.

3
ответ дан 6 December 2019 в 10:01
поделиться

What are you trying to accomplish? This is a way to return an Enum:

public class Test
{
    public static void main(String args[])
    {
        System.out.println(doit());
    }

    public enum Foo {
        BAR,
        BAZ;
    }
    public static Enum doit() {
        return Enum.valueOf(Foo.class,"BAR");
    }
}

But, I'm guessing this is not what you are going for?

2
ответ дан 6 December 2019 в 10:01
поделиться

Yes, it definitely is possible.

private Enum getRetentionPolicy() {
    return java.lang.annotation.RetentionPolicy.SOURCE;
}

If your question is about declaring Enums, you may declare them:

  • in their own java file, similar to a top-level class;
  • within a java file belonging to another class, similar to a static inner class;
1
ответ дан 6 December 2019 в 10:01
поделиться

Not totally sure what your goal is, but if you wanted to return a generified method (i.e. one that would be overridden) you might have something like the following:

public class MyEnumClass<T extends Enum<T>> {
    public T resources() {
        //do stuff here
    }
}

Not entirely sure what you would gain there, although it can be beneficial if you are talking about different sets of Enums and their elements.

If you are talking about the Enum class (i.e. the percursor to Iterator) as far as I know it has not been generified, so I am not sure generics would help much here.

1
ответ дан 6 December 2019 в 10:01
поделиться

You can refer to a value of an enum by its name, e.g. Suit.SPADES.

You can iterate over all values by using the values() method and pick one of the values.

1
ответ дан 6 December 2019 в 10:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: