以下代码在Eclipse中编译(并按预期运行测试):
坦白说,枚举+接口+类型参数(泛型)同时使用的复杂性在我编写代码时困扰了我,但我认为我最终已经把它搞定了。
目标是编写像这样的调用代码:
例如,在Eclipse中,以下测试编译并通过:
任何关于“正确”的提示,Eclipse还是javac,都会受到赞赏。
如果有关于实现该想法的其他方法的建议也将不胜感激:将类作为方法参数传递给
顺便说一下,请不要批评这个方法的目的;我已经从更有用/有意义的代码中简化了它。我不想讨论“从枚举类型中找到第一个元素”的优点 - 这不是这个问题的重点。
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
中枚举对象的类型。顺便说一下,请不要批评这个方法的目的;我已经从更有用/有意义的代码中简化了它。我不想讨论“从枚举类型中找到第一个元素”的优点 - 这不是这个问题的重点。