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

标签 java eclipse enums enumset

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

相关文章:

typescript - 向枚举添加描述属性并在 TypeScript 中读取此描述

java - 带预览的自定义对话框

java - 如何在web层捕获OptimisticLockException

java - 强制 kafka 消费者轮询延迟最高的分区

android - Eclipse应用程序包重命名工具报错

eclipse - 在eclipse中启动两个spring boot应用

android - 导出已签名的 apk 时出错 - Dalvik 格式失败,出现错误 1

java - Java 中的 XML 解析和存储信息

具有实现接口(interface)的多个枚举的 Java 泛型

python - 在 python 3 中遍历枚举时,并非所有元素都出现