【发布时间】:2014-08-12 11:14:30
【问题描述】:
我正在为一个必须处理泛型枚举的类设计一个方法的参数(我的意思是,该类可以是库的一部分,并且用户将为该类方法提供用户定义的枚举,其具体类型对于正在设计的类来说是未知的 - 我们称这个类为“库类”)。
我想在语法上尽可能地限制该参数类型,以便只允许正确的类型。
我的要求是类型必须是实现特定接口的枚举,EnumKind:
public interface EnumKind {
String getText();
}
到目前为止,我已经能够写出这种类型了:
Class<? extends Enum<? extends EnumKind>> t;
有了该声明,并拥有这些:
public enum MyEnumKind implements EnumKind {
// ...
public String getText() {
// TODO Auto-generated method stub
return null;
}
}
public class MyClassKind implements EnumKind {
@Override
public String getText() {
// TODO Auto-generated method stub
return null;
}
}
public enum MyEnum {
}
只有t = MyEnumKind.class 是正确的,其他赋值(如t = MyClassKind.class)被编译器拒绝,这是我想要的行为。
现在,在我的方法体中,我可以成功地做到:
Enum<? extends EnumKind>[] tt = t.getEnumConstants();
但我还没有找到直接检索EnumKinds 的方法,以访问每个枚举常量getText() 方法。
如何在没有显式转换的情况下获得 EnumKind 元素数组?该类型声明是我能写的最好的,还是我可以改进它?
如果无法避免显式转换,我是否可以 100% 安全地确保类型声明将避免任何ClassCastException(或任何类似异常)被抛出的可能性?
编辑
我会详细说明一下,因为我遇到了另一个障碍。
EnumKind 接口要求枚举将字符串与每个枚举常量相关联,即:
public enum MyEnumKind implements EnumKind {
A("#A#"),
B("#B#"),
C("#C#");
private String text;
private Token(String text) {
this.text = text;
}
@Override
public String getText() {
return text;
}
}
接下来,我要检索与特定字符串对应的枚举常量,例如
? enumValue = getValueFor("#A#");
enumValue(它的类型应该是什么?)这里应该代表MyEnumKind.A,不需要知道实际值,因为enumValue会被传递给另一个方法。
我已经设计了这样的库类(在@JoopEggen 回答之后):
public class EnumManager<T extends Enum<?> & EnumKind> {
private Class<T> en;
public EnumManager(Class<T> en) {
this.en = en;
}
protected ? getValueFor(String s) {
for(EnumKind ek : en.getEnumConstants()) {
if(s.equals(ek.getText())) {
// I found the enum constant I need... and now?
return ? ;
}
}
}
//...
我应该如何完成该代码?
【问题讨论】:
标签: java generics interface enums