[英]Java: abstract enum constant
有没有办法将抽象枚举声明为函数参数? 我想要实现的是:
interface EnumInterpreterInterface {
String getStringValue(**abstract enum constant** e);
}
interface EnumProviderInterface {
//classes implementing this interface will hold at least one enum
Enum getEnum();
}
class EnumProvider implements EnumProviderInterface {
enum Numbers {ONE, TWO, THREE};
}
class EnumInterpreter implements EnumInterpreterInterface {
String getStringValue(EnumProvider.Numbers n) {
switch(e) {
case EnumProvider.Numbers.ONE: return "one";
case EnumProvider.Numbers.TWO: return "two";
default: return "three";
}
}
}
如果您想要的是抽象枚举,则可以执行以下操作:
interface EnumInterpreterInterface {
String getStringValue(Enum<?> e);
}
由于Enum是抽象类,因此可以用作任何类。
但是必须注意实现,请考虑此类:
class EnumInterpreter implements EnumInterpreterInterface { code }
然后将像这样实现getStringValue:
String getStringValue(Enum n)
{
if(n instanceof EnumProvider.Numbers)
{
EnumProvider.Numbers e=(EnumProvider.Numbers)n;
switch(e) {
case ONE: return "one";
case TWO: return "two";
default: return "three";
}
}
else //do something, maybe return null or throw an exception
}
请注意,您不能将签名更改为此String getStringValue(EnumProvider.Numbers n)
因为编译器会抱怨(但如果枚举是返回值,它就不会抱怨)。
而且由于我们不能在签名中限制Enum类型,因此必须使用instanceof
和cast进行检查。
Java枚举中的类是类,因此上面的代码起作用。 但是,对于其他情况可能并非如此(例如,C#,C ++中的枚举由整数表示),据我所知,没有任何方法可以执行此操作:)。
尚不清楚,如果我错了,请纠正我,但是通过您提供的switch语句,我假设您会想要像使用附加数据进行枚举之类的事情。
这是一个例子:
enum Numbers {
ZERO("numbers.zero"), ONE("numbers.one"), TWO("numbers.two");
private String key;
private Numbers(String key) {
this.key = key;
}
public String getKey() {
return key;
}
}
对于枚举,每个值都是枚举的一个实例,因此每个实例可能具有在枚举构造函数中提供的不同的其他属性。
这是您检索其他数据的方式:
System.out.println(Numbers.ZERO.getKey());
您甚至可以在资源包文件中具有匹配的密钥以进行本地化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.