我有一些旧的命令行参数解析我4年前为Java 5编写的代码,由于更改了泛型的处理方式和/或某些库类是否通用,因此无法在Java 6中编译。在尝试修复它时,我遇到了以下问题;自从我接触Java以来已经4年了,我从来都不是一般的仿制药专家,这有点让我感到难过。
库允许我指定某些命令行选项对应于枚举。为此,与此选项对应的ArgumentSpecification对象想要保存一个Class对象,我们称之为“enumClass”,对应于枚举类。不幸的是,我似乎无法弄清楚如何正确编写该字段的类型来约束它包含对应于实际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,这似乎与{{1”不匹配因为我得到这样的编译器错误:
"<? extends Enum<?>>"
有没有办法在这里用正确的类型声明我丢失的字段?如果是这样,它是什么?如果没有,是不是可怕的Java破坏能够在方法中声明你不能用于字段的类型?还是我非常困惑,我的问题从一开始就没有意义?
答案 0 :(得分:9)
如果你需要像这样定义一个具有显式参数E
的字段,那么你可能需要参数化声明字段的类型。像这样编译:
class MyClass<E extends Enum<E>> {
Class<E> enumClass;
}
答案 1 :(得分:7)
您正在尝试声明一个“通用字段” - 一个具有类型参数的字段。 Java中没有这样的概念 - 只有方法和类型才能引入类型参数。
正如polygenelubricants所说,你可以在类型本身中引入一个额外的类型参数,并将其用作字段的类型。