我有2个枚举类:
public enum Dogs
{
JACKIE("Jackie"),
BOBBY("Bobby");
}
和
public enum Cats
{
CHAN("Chan"),
SPONGE("Sponge");
}
现在我在其他一些类中有一个方法,希望将枚举作为参数传递,因此我可以根据需要选择其中一个。
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)
}
但是它不这样接受。可以将通用类型传递为“枚举”吗?
答案 0 :(得分:5)
Enum
是 all 枚举的 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 :(得分:1)
您尝试的方法在很大程度上无法正常工作,因为Enum
本身没有values
方法。这是枚举类的隐式静态方法。
如果您绝对必须使用单独的Dogs
和Cats
枚举类型执行此操作,而不是使用Thomas suggests的方式进行操作,则可以传递结果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
显着简化我的早期版本。)
答案 2 :(得分:0)
不太清楚您要使用此方法执行的操作,但是可以执行以下操作。
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);
}