更好的方法来创建一个限制用户只传递一种枚举的方法

Moh*_*nan 2 java enums

我有一个接口,只能被枚举覆盖 -

interface Parent{
    int someMethod(); 
}
Run Code Online (Sandbox Code Playgroud)

以及我要传递Parent的实现者的方法.此方法希望限制用户传递除枚举之外的任何其他实现者 -

public static <T extends Enum<? extends Parent>> T fromInt(Class<T> enumClass){}
Run Code Online (Sandbox Code Playgroud)

现在的问题是

  1. 枚举签名是不洁的加上使用?.
  2. 为了访问someMethod父类,需要在方法中输入类型.如果我们想像这样访问它 -

    Arrays.stream(enumClass.getEnumConstants())
                .filter(ev -> ((Parent)ev).someMethod() == someVal)
                .findFirst().get();
    
    Run Code Online (Sandbox Code Playgroud)

是否有更好的方法来创建此方法的签名来解决这些问题?

Tun*_*aki 5

您不能强制接口的实现者只是枚举.

但是,你可以通过说类型T应该是枚举类型,带有T extends Enum<T>Parent类型来实现你想要的& Parent.&用于声明多个接口的交集.它确保在方法中,T可以绑定EnumParent.

这将是一个实现:

public static <T extends Enum<T> & Parent> T fromInt(Class<T> enumClass) {
    return Arrays.stream(enumClass.getEnumConstants())
                 .filter(ev -> ev.someMethod() == 1)
                 .findFirst()
                 .get();
}
Run Code Online (Sandbox Code Playgroud)