Jor*_*dan 2 java generics enums
所以,我有一个抽象类,如:
public abstract class AbstractParent <E extends Enum<E>> {...}
Run Code Online (Sandbox Code Playgroud)
在AbstractParent里面的非抽象方法的某处,我想迭代E的值.这可能吗?
更好的例子:
public abstract class AbstractParent <E extends Enum<E>> {
...
protected void doSomething() {
//iterate over the values of E and perform an action using them
}
}
public class Child extends AbstractParent<Child.Index> {
public static enum Index {
...
}
public Child() {
super();
this.doSomething(); //this should iterate over Index's values
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:
所以,感谢mdma,这非常有效:
public abstract class AbstractParent <E extends Enum<E>> {
...
protected void doSomething() {
//iterate over the values of E and perform an action using them
ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
Type t = pt.getActualTypeArguments()[0];
E[] enumValues = ((Class<E>)t).getEnumConstants();
// enumValues is now an iterable array of the values inside Index
}
}
public class Child extends AbstractParent<Child.Index> {
public static enum Index {
...
}
public Child() {
super();
this.doSomething(); //this should iterate over Index's values
}
}
Run Code Online (Sandbox Code Playgroud)
感谢LOADS对mdma,你应该得到比我能给的更多的积分.
EDIT2:超类和接口上的泛型不会被删除.您可以在运行时获取泛型类型,并使用它来获取枚举值.请参见Class.getGenericSuperclass.这将节省您必须在构造函数中传递值或类.
原文:你不能用泛型来做这件事.但是,如果你也传入相应的类,例如构造函数
AbstractParent(Class<E> enumClass)
{
this.enumClass = enumClass;
}
Run Code Online (Sandbox Code Playgroud)
然后你可以使用它来获取相应的枚举值
public E[] getValues()
{
return this.enumClass.getEnumConstants();
}
Run Code Online (Sandbox Code Playgroud)
编辑:虽然客户端不是专业程序员,但编译器将确保传递正确的类.您还可以通过提供示例和单元测试来明确使用.
您还可以获取Enum的构造函数和实际值,并从中派生类.这可能更容易使用,因为参数是一个E而不是更"可怕" Class<E>.
例如
AbstractParent(E enumValue)
{
this.enumClass = enumValue.getClass();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
428 次 |
| 最近记录: |