繁体   English   中英

如何在方法中传递枚举参数

[英]How to pass enum parameter in a method

我有 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
    }
}

因此,我不想提供硬编码的“Dogs”,而是希望有一个选择并将参数传递给该方法,例如

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

但它不接受它这样。 是否可以将泛型类型作为“枚举”传递?

Enum所有枚举的类,因此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等。在您问题的两行之间阅读让我觉得这就是您真正想要的,而不是如何使用枚举。

您尝试的方法在很大程度上不起作用,因为Enum本身没有values方法。 这是枚举类的隐式静态方法。

如果您绝对必须使用单独的DogsCats枚举类型执行此操作,而不是按照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 :而不是传递在DogsCats ,你会通过他们的类:

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显着简化。)

不太确定你想用这种方法做什么,但你可以做这样的事情。

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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM