【发布时间】:2015-02-27 21:18:49
【问题描述】:
以下代码在 Eclipse 中编译(并按预期运行测试):
import java.util.EnumSet;
public class EnumTest {
static enum Cloneables implements Cloneable {
One, Two, Three;
}
public <T extends Cloneable> T getOne(Class enumType) {
EnumSet<? extends T> set = EnumSet.allOf(enumType);
return set.iterator().next();
}
}
但是,直接使用 javac (JDK 7) 或通过 Maven 编译失败并出现以下错误:
type argument ? extends T is not within bounds of type-variable E
说实话,枚举 + 接口 + 类型参数(泛型)的复杂性在我编写代码时一下子把我吓坏了,但我认为我终于做对了。
目标是编写如下调用代码:
Cloneable something = enumTest.getOne(Cloneables.class);
例如,在 Eclipse 中,以下测试编译并通过:
@Test
public void testGetFirst() {
assertSame(Cloneables.One, getOne(Cloneables.class));
}
任何关于哪个是“正确”的线索,Eclipse 或 javac,都值得赞赏。
还感谢有关实现该想法的替代方法的任何建议:将类作为方法参数,可在 EnumSet.allOf() 中使用,并且还确定 EnumSet 中的 Enum 对象的类型
顺便说一句,不要费心批评这种方法的目的;我已经从更有用/有意义的代码中减少了它。我对讨论“从枚举类型中查找第一个元素”的优点不感兴趣——这不是这个问题的重点。
【问题讨论】:
-
看来这可能是 javac (JDK 1.7.0_60) 中的一个错误。下面接受的答案是一种解决方法(实际上是更清洁的代码)。详细分析见bugs.eclipse.org/bugs/show_bug.cgi?id=456459#c7
标签: java eclipse enums enumset