作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
以下代码在 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
老实说,在编写代码时,枚举 + 接口(interface) + 类型参数(泛型)的复杂性一下子让我失望了,但我认为我终于做对了。
目标是像这样编写调用代码:
Cloneable something = enumTest.getOne(Cloneables.class);
例如,在 Eclipse 中,以下测试编译并通过:
@Test
public void testGetFirst() {
assertSame(Cloneables.One, getOne(Cloneables.class));
}
感谢任何关于 Eclipse 或 javac 哪个是“正确”的线索。
同样值得赞赏的是关于实现该想法的替代方法的任何建议:将类作为方法参数,可以在 EnumSet.allOf()
中使用,并且还确定 Enum 对象的类型EnumSet
顺便说一句,不要费心去批评这个方法的目的;我已经从更有用/有意义的代码中减少了它。我对讨论“从枚举类型中找到第一个元素”的优点不感兴趣——这不是这个问题的重点。
最佳答案
您需要确保T
是一个枚举类型,否则它将不满足EnumSet
的约束:
public <T extends Enum<T> & Cloneable> T getOne(Class enumType)
此外,您不需要在 EnumSet
中使用通配符,也不应使用原始 Class
类型:
public <T extends Enum<T> & Cloneable> T getOne(Class<T> enumType) {
EnumSet<T> set = EnumSet.allOf(enumType);
return set.iterator().next();
}
关于java - Eclipse 编译器和 javac 之间的差异 - 枚举、接口(interface)和泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27726965/
我是一名优秀的程序员,十分优秀!