Как передать параметр enum в метод - PullRequest
0 голосов
/ 13 марта 2019

У меня есть 2 класса enum:

public enum Dogs
{
 JACKIE("Jackie"),
 BOBBY("Bobby");
}

и

public enum Cats
    {
     CHAN("Chan"),
     SPONGE("Sponge");
    }

И теперь у меня есть метод в каком-то другом классе, где я хочу передать enum в качестве параметра,поэтому я мог выбрать любой из них в соответствии с моими потребностями.

public void findAnimal()
{
    List<Dogs> animals = Arrays.asList(Dogs.values());
    for (Dogs animal: animals)
    {
        rest of the code goes here
    }
}

Поэтому вместо предоставления жестко запрограммированных «собак» я хочу иметь выбор и передавать параметр методу, что-то вроде

public void (Enum enumAnimals)
{
    List<Enum> animals = Arrays.asList(Enum.values());
    for (Enum animal: animals)
}

Но он не принимает это так.Можно ли передать универсальный тип как "Enum"?

Ответы [ 3 ]

5 голосов
/ 13 марта 2019

Enum - это класс base для всех перечислений, поэтому Enum.values() ничего не сделает.Если вы хотите использовать несколько перечислений, вы можете сделать так, чтобы они реализовали общий интерфейс, но даже тогда вам нужно будет предоставить экземпляры.Это может быть сделано с помощью размышлений, но я чувствую, что передаю вам силу, которая теперь станет рецептом катастрофы.В общем, перечисления предназначены для статических типов, таких как AnimalType, а не для отдельных экземпляров, таких как конкретная кошка.

Я бы посоветовал вам что-то вроде этого (очень упрощенный код, чтобы сделать его коротким):

enum AnimalType { 
  CAT,
  DOG;
}

class Animal {
  String name;
  AnimalType type;

  Animal( String n, AnimalType t) {
    name = n;
    type = t;
  }
}

Set<Animal> animals = ... //create a set
animals.add( new Animal( "Jackie", AnimalType.CAT ) );
animals.add( new Animal( "Chan", AnimalType.DOG) );
...

Обратите внимание, что многие примеры / учебные пособия, в которых используется такой класс, как Animal, фокусируются больше на наследовании, т.е. class Cat extends Animal и т. Д. Чтение между строками вашего вопроса заставляет меня чувствовать, что это то, что вы на самом деле ищете, а не как использовать перечисления.

1 голос
/ 13 марта 2019

То, что вы пробовали, не работает в основном потому, что само по себе Enum не имеет values метода.Это неявный статический метод классов enum.

Если у вас абсолютно есть , чтобы сделать это с отдельными типами enum Dogs и Cats, а не как Thomasпредлагает , вы можете передать результат вызова values:

obj.findAnimal(Dogs.values());
// or
obj.findAnimal(Cats.values());

, тогда метод будет просто:

public void findAnimal(Enum[] animals) {
    for (Enum animal : animals) {
        System.out.println(animal);
    }
}

Если то по какой-то причине не подходит, также возможно использовать Class.getEnumConstants: вместо ввода Dogs или Cats вы должны перейти в их класс:

obj.findAnimal(Dogs.class);
// or
obj.findAnimal(Cats.class);

Метод будет выглядеть следующим образом:

public void findAnimal(Class enumClass)
{
    Enum[] animals = (Enum[])enumClass.getEnumConstants();
    for (Enum animal: animals) {
        System.out.println(animal);
    }
}

(Спасибо Pshemo за то, что вы указали, что моя более ранняя версия могла быть значительно упрощена с использованием getEnumConstants.)

0 голосов
/ 13 марта 2019

Не совсем уверен, что именно вы хотите сделать в этом методе, но вы можете сделать что-то вроде этого.

enum Dogs {
    JACKIE("Jackie"),
    BOBBY("Bobby");
    private final String name;

    Dogs(String name) {
        this.name = name;
    }
}

enum Cats {
    CHAN("Chan"),
    SPONGE("Sponge");
    private final String name;

    Cats(String name) {
        this.name = name;
    }
}

<E extends Enum<E>> void method(E e) {
    Enum<E>[] animals = e.getClass().getEnumConstants();
    for (Enum<E> animal : animals) {
        System.out.println(animal);
    }
}

private void test() {
    method(Dogs.BOBBY);
    method(Cats.CHAN);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...