Java 在方法接受类中使用enum的接口方法

Java 在方法接受类中使用enum的接口方法,java,enums,Java,Enums,我有一个需要接受枚举类的方法。这些枚举实现一个接口。现在我需要访问枚举方法(如ordinal()、name()等)和接口方法。我所尝试的: public <T extends ConfigFeature, Enum> void showEnabledFeatures(Class<T> enumType, long mask) { List<T> list = Arrays.asList(enumType.getEnumConstants());

我有一个需要接受枚举类的方法。这些枚举实现一个接口。现在我需要访问枚举方法(如ordinal()、name()等)和接口方法。我所尝试的:

public <T extends ConfigFeature, Enum> void showEnabledFeatures(Class<T> enumType, long mask) {
    List<T> list = Arrays.asList(enumType.getEnumConstants());
    list.forEach(item -> {
        // My interface's method, works fine
        item.getMask();
        // Enum method doesn't work:
        // item.ordinal();
    });
}
public void showEnabledFeatures(类枚举类型,长掩码){
List List=Arrays.asList(enumType.getEnumConstants());
列表。forEach(项目->{
//我的界面的方法,工作良好
item.getMask();
//枚举方法不起作用:
//项.序数();
});
}
颠倒顺序会颠倒工作顺序:

public <T extends Enum, ConfigFeature> void showEnabledFeatures(Class<T> enumType, long mask) {
    List<T> list = Arrays.asList(enumType.getEnumConstants());
    list.forEach(item -> {
        // My interface's method, doesn't work now
        // item.getMask();
        // Enum method now works:
        item.ordinal();
    });
}
public void showEnabledFeatures(类枚举类型,长掩码){
List List=Arrays.asList(enumType.getEnumConstants());
列表。forEach(项目->{
//我的接口的方法,现在不起作用
//item.getMask();
//枚举方法现在可以工作:
项.序数();
});
}

是否有办法从interface和Enum访问这两个方法?

将第二个示例中的
替换为
&
。您可以使用
&
声明多个边界,只要它们是从第二种类型开始的接口。如果使用逗号,则它是一个单独的类型参数,而不是绑定。

您使用了错误的语法来表示
T
必须实现此接口,并且是一个枚举

这:

未将
T
约束为
ConfigFeature
。您正在声明一个名为
ConfigFeature
的新通用参数

正确的语法是使用

<T extends Enum<T> & ConfigFeature>

你的语法是错误的;你需要:

public <T extends Enum<T> & ConfigFeature>
公共
您使用的语法创建了两个泛型类型参数,一个名为
T
,另一个名为
Enum
(其中
Enum
未绑定,而T绑定以扩展
ConfigFeature


注意,为了避免任何关于使用原始类型的泛型警告,还必须向
Enum
绑定提供类型参数。名为
X
的枚举始终扩展
enum
,因此您可以使用
T扩展enum
,方法本地泛型声明的全文变为

,只是为了添加到现有答案中,而不是像其他答案中所述那样使用,您可以定义将所需接口与枚举的返回方法相结合的接口,如:

public interface ConfigFeatureEnumI <T extends Enum<T>> extends ConfigFeatureI{
    @SuppressWarnings("unchecked")
    default public T asEnum() {
        return (T) this;
    }
}
然后,
showEnabledFeatures
可以如下所示:

public <T extends ConfigFeatureEnumI<?>> void showEnabledFeatures(Class<T> enumType, long mask) {
    List<T> list = Arrays.asList(enumType.getEnumConstants());
    list.forEach(item -> {
        // Interface method works:
        item.getMask();
        // Enum method works via asEnum():
        item.asEnum().ordinal();
    });
}

public@cpp初学者更新。还向
Enum
添加了类型参数化,因为
Enum
本身是无效的原始类型。最好将其改为
。可能重复,但这将在每次调用来自Enum的任何函数时强制转换,这在IMO中是不必要的。多个边界提供了一个更干净(性能更好?)的解决方案。@ayushgp它可能是更干净的解决方案(如果您熟悉泛型的话),但正如您的问题所示,它很容易漏掉一些东西。我的观点是没有它也可以做到,在看到你的问题之前,我永远不会考虑使用多个边界
public <T extends Enum<T> & ConfigFeature>
public interface ConfigFeatureEnumI <T extends Enum<T>> extends ConfigFeatureI{
    @SuppressWarnings("unchecked")
    default public T asEnum() {
        return (T) this;
    }
}
public enum ConfigEnum implements ConfigFeatureEnumI<ConfigEnum>{//...
public <T extends ConfigFeatureEnumI<?>> void showEnabledFeatures(Class<T> enumType, long mask) {
    List<T> list = Arrays.asList(enumType.getEnumConstants());
    list.forEach(item -> {
        // Interface method works:
        item.getMask();
        // Enum method works via asEnum():
        item.asEnum().ordinal();
    });
}