gpt4 book ai didi

java - Eclipse 编译器和 javac 之间的差异 - 枚举、接口(interface)和泛型

转载 作者:搜寻专家 更新时间:2023-10-31 20:11:06 27 4
gpt4 key购买 nike

以下代码在 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com