不能像通用方法类型一样使用Java通用字段类型?

不能像通用方法类型一样使用Java通用字段类型?

问题描述:

我有4年前为Java 5编写的一些旧的命令行参数解析代码,并且它不会在Java 6中编译,这要归功于泛型的处理方式和/或某些库类是否通用。在尝试修复它时,我遇到了以下问题;自从我接触Java已经4年了,我从来就不是仿制药领域的专家,这有点让我感到困惑。不能像通用方法类型一样使用Java通用字段类型?

该库允许我指定某些命令行选项对应于枚举。为此,与此选项对应的ArgumentSpecification对象需要保存一个Class对象,我们将其称为“enumClass”,对应于enum类。不幸的是,我似乎无法弄清楚如何正确编写该字段的类型,以限制它包含与实际的Enum类相对应的类对象。我想我想要的是这样的:

protected <E extends Enum<E>> Class<E> enumClass; // compiler error 

但编译器barfs就此。在另一方面,编译器与返回值和/或参数所指定的方式,有方法完全满意:

protected <E extends Enum<E>> Class<E> dummyTest(Class<E> foo) { return foo; } // "works" 

我可以尝试使用本作的领域,而不是:

protected Class<? extends Enum<?>> enumClass; 

但实际上并不工作......代码的其他部分需要“<E extends Enum<E>>"”类型,所以它们实际上可以获得E,而这看起来与"<? extends Enum<?>>"不匹配,因为我得到如下编译器错误:

Bound mismatch: The generic method checkedEnumFromString(Class<E>, String) of type EnumUtil is not applicable for the arguments 
(Class<capture#1-of ? extends Enum<?>>, String). The inferred type capture#1-of ? extends Enum<?> is not a valid substitute for the bounded 
parameter <E extends Enum<E>> 

有没有办法在这里声明我正在丢失的正确类型的字段?如果是这样,那是什么?如果没有,是不是可怕地破坏了Java的能够声明类型的方法,你不能为字段?或者我非常困惑,以至于我的问题没有道理可言?

如果您需要定义与这样的明确的参数E一个字段,那么你可能需要参数,其中场在声明的类型事情是这样的编译:

class MyClass<E extends Enum<E>> { 
    Class<E> enumClass; 
} 
+2

我很害怕那个......呃。我认为在我的情况下,只是接受Java的类型系统被延迟(谢谢,键入擦除!)并使用“Class enumClass;结合*胡言乱语@ShutTheHellUp(“unchecked”); 感谢您的回应,但。 – 2010-06-20 17:18:30

你试图声明一个“通用字段” - 它本身具有类型参数。 Java中没有这样的概念 - 只有方法和类型可以引入类型参数。

由于polygenelubricants说,你可以在类型本身中引入一个额外的类型参数,并将其用作字段的类型。