我正在尝试将枚举传递给方法,迭代枚举值,并调用该枚举对所有这些值实现的方法。我在“value.getAlias()”部分遇到编译器错误。它说“方法getAlias()未定义为类型E”我试图表明E实现了HasAlias接口,但它似乎不起作用。这是可能的,如果是这样,我如何修复下面的代码来做我想要的?下面的代码只是为了显示我的过程,我不打算只在枚举中打印值的名称,而是为了证明我的问题。
public interface HasAlias{ String getAlias(); };
public enum Letters implements HasAlias
{
A("The letter A"),
B("The letter B");
private final String alias;
public String getAlias(){return alias;}
public Letters(String alias)
{
this.alias = alias;
}
}
public enum Numbers implements HasAlias
{
ONE("The number one"),
TWO("The number two");
private final String alias;
public String getAlias(){return alias;}
public Letters(String alias)
{
this.alias = alias;
}
}
public class Identifier
{
public <E extends Enum<? extends HasAlias>> void identify(Class<E> enumClass)
{
for(E value : enumClass.getEnumConstants())
{
System.out.println(value.getAlias());
}
}
}
答案 0 :(得分:4)
以下是将类型绑定到实现HasAlias的枚举的方法:
<E extends Enum<E> & HasAlias>
一旦你改变了,剩下的就行了。
答案 1 :(得分:2)
以下代码编译并运行良好,因为在Class上定义了getEnumConstants()。不必说这个类是Enum的类。
public class EnumExtended {
static interface HasAlias{ String getAlias(); }
static class Identifier {
static void identify(Class<? extends HasAlias> enumClass ) {
for( HasAlias value : enumClass.getEnumConstants()) {
System.out.println( value.getAlias());
}
}
}
public static void main( String[] args ) {
Identifier.identify( Letters.class );
Identifier.identify( Numbers.class );
}
static enum Letters implements HasAlias {
A("The letter A"),
B("The letter B");
private final String alias;
@Override
public String getAlias(){return alias;}
Letters(String alias1) {
this.alias = alias1;
}
}
static enum Numbers implements HasAlias {
ONE("The number one"),
TWO("The number two");
private final String alias;
@Override public String getAlias(){return alias;}
Numbers(String alias1) {
this.alias = alias1;
}
}
}
答案 2 :(得分:1)
I found the answer in this other post
通过参考上面的帖子,我能够将我的代码更改为以下内容以使其正常工作:
public <E extends Enum<?> & HasAlias> void identify(Class<E> enumClass)
{
for(E value : enumClass.getEnumConstants())
{
System.out.println(value.getAlias());
}
}
答案 3 :(得分:0)
是的,您必须在界面中声明您的功能。为了成为一个接口,它必须包含抽象类,即没有定义的函数。
所以在这里你忘了正确宣布你的功能。
String getAlias();