Java: общее перечисление в параметре метода - PullRequest
27 голосов
/ 01 декабря 2010

Задайте следующий вопрос:

Java: параметр Enum в методе

Я хотел бы знать, как я могу отформатировать код, чтобы требовать перечисления вообще.

Foo.java

public enum Foo { 
    a(1), b(2);
}

Bar.java

public class Bar {
    public Bar(generic enum);
}

Позже у меня будет больше классов enum, таких как "foo", но вы все равно можете создать панель, содержащую любой тип классов enum. У меня кстати "jdk1.6.0_20" ...

Ответы [ 3 ]

36 голосов
/ 01 декабря 2010

См. Методы в EnumSet для справки, например,

public static <E extends Enum<E>> EnumSet<E> of(E e)

(Этот метод возвращает EnumSet с одним элементом из заданного элемента Enum e)

Итак, общие границы, которые вам нужны: <E extends Enum<E>>


На самом деле, вы, вероятно, сделаете Bar сам по себе родовым:

public class Bar<E extends Enum<E>> {

    private final E item;

    public E getItem(){
        return item;
    }

    public Bar(final E item){
        this.item = item;
    }
}

Вы также можете добавить заводской метод, например from, with и т. Д.

public static <E2 extends Enum<E2>> Bar<E2> with(E2 item){
    return new Bar<E2>(item);
}

Таким образом, в коде клиента вы должны написать общую подпись только один раз:

// e.g. this simple version
Bar<MyEnum> bar = Bar.with(MyEnum.SOME_INSTANCE);
// instead of the more verbose version:
Bar<MyEnum> bar = new Bar<MyEnum>(MyEnum.SOME_INSTANCE);

Справка:

14 голосов
/ 23 сентября 2011

Вы также можете сделать это следующим образом:

public class Bar {
    public Bar(Enum<?> e){}
}

Каждое перечисление расширяет Enum. Тогда вы можете использовать это, если вам нужны константы перечисления:

e.getDeclaringClass().getEnumConstants()
7 голосов
/ 01 декабря 2010
public class bar {
    public <E extends Enum<E>> void bar(E enumObject);
}

Метод bar теперь может получать любые типы перечислений.

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