不能像通用方法类型一样使用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;
}
你试图声明一个“通用字段” - 它本身具有类型参数。 Java中没有这样的概念 - 只有方法和类型可以引入类型参数。
由于polygenelubricants说,你可以在类型本身中引入一个额外的类型参数,并将其用作字段的类型。
我很害怕那个......呃。我认为在我的情况下,只是接受Java的类型系统被延迟(谢谢,键入擦除!)并使用“Class enumClass;结合*胡言乱语@ShutTheHellUp(“unchecked”); 感谢您的回应,但。 – 2010-06-20 17:18:30