Java:枚举类型强制转换<?>

3

想象一下我有这个:

class MyClass<E extends Enum<E>> {
    private E myEnum;

    public MyClass(E myEnum) {
        this.myEnum = myEnum;
    }

    public E getMyEnum() { return myEnum; }
    public void setMyEnum(E e) { myEnum = e; }
}

现在我有这些:

Enum<?> someRandomEnum = // Retrieved from somewhere

MyClass<?> enumClassA = new MyClass<>(someRandomEnum); // Cannot infer type arguments

MyClass<?> enumClassB = new MyClass<Object>(someRandomEnum); // Obviously Object is not subclass of an enum

MyClass<?> enumClassC = new MyClass<? extends Enum<?>>(someRandomEnum); // Cannot instantiate the type MyClass<? extends Enum<?>>

我尝试了很多方法来转换这个,但是我无法将 Enum<?> 转换为 MyClass<?>。有人知道如何做吗?


5
MyClass<?>的实例不能是Enum<?>的实例,因此进行强制类型转换没有意义。 - khelwood
1
你必须将其声明为 MyClass<E extends Enum<E>> 吗?你可以只声明为 MyClass<E extends Enum<?>> 吗? - Andy Turner
@khelwood 我并不是直接将 Enum<?> 强制转换为 MyClass<?>MyClass 存储了特定类型的枚举值,但对于这个特定的用例,我想放宽类型安全性,因为我知道它不会抛出 ClassCastException - Jai
在泛型之间进行强制转换永远不会抛出异常 - 泛型参数在运行时不会被保留。当您以不兼容的方式访问使用类型参数的成员时,才会出现异常。 - Sebastian Redl
1
我想知道这个用例是什么,它不是已经被像EnumSetEnumMap这样的东西所覆盖了吗? - Powerlord
显示剩余2条评论
1个回答

0

实例化一个原始类型,然后进行强制转换:

MyClass<?> enumClassA = (MyClass<?>)new MyClass(someRandomEnum);

代码可以编译通过,但会产生以下(无害的)编译器警告:

未经检查的调用 'MyClass(E)',作为原始类型 'com.foo.bar.SomeRandomEnum' 的成员

可以通过添加此注释来抑制警告

@SuppressWarnings("unchecked")

返回包含此代码的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接