Java 在方法接受类中使用enum的接口方法
我有一个需要接受枚举类的方法。这些枚举实现一个接口。现在我需要访问枚举方法(如ordinal()、name()等)和接口方法。我所尝试的: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());
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();
});
}