Java泛型字段类型与泛型方法类型不一样具体吗?

Sco*_*ies 8 java generics

我有一些旧的命令行参数解析我4年前为Java 5编写的代码,并且由于更改了泛型的处理方式和/或某些库类是否通用,因此无法在Java 6中编译.在尝试修复它时,我遇到了以下问题; 自从我接触Java以来​​已经4年了,我从来都不是一般的仿制药专家,这有点让我感到困惑.

该库允许我指定某些命令行选项对应于枚举.为此,与此选项对应的ArgumentSpecification对象想要保存一个Class对象,我们称之为"enumClass",对应于枚举类.不幸的是,我似乎无法弄清楚如何正确编写该字段的类型来约束它包含对应于实际Enum类的类对象.我想我想要的是:

protected <E extends Enum<E>> Class<E> enumClass; // compiler error
Run Code Online (Sandbox Code Playgroud)

但是这个编译器barfs.另一方面,编译器完全满意具有返回值和/或参数指定方法的方法:

protected <E extends Enum<E>> Class<E> dummyTest(Class<E> foo) { return foo; } // "works"
Run Code Online (Sandbox Code Playgroud)

我可以尝试在场上使用它:

protected Class<? extends Enum<?>> enumClass;
Run Code Online (Sandbox Code Playgroud)

但这并没有真正起作用...代码的其他部分需要" <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>>
Run Code Online (Sandbox Code Playgroud)

有没有办法在这里用正确的类型声明我丢失的字段?如果是这样,它是什么?如果没有,是不是可怕的Java破坏能够在方法中声明你不能用于字段的类型?还是我非常困惑,我的问题开始没有意义?

pol*_*nts 9

如果你需要用这样的显式参数定义一个字段E,那么你可能需要参数化声明字段的类型.像这样编译:

class MyClass<E extends Enum<E>> {
    Class<E> enumClass;
}
Run Code Online (Sandbox Code Playgroud)

  • 我很害怕...呃.我认为在我的情况下,接受Java的类型系统被延迟(谢谢,键入擦除!)并使用"类enumClass;"实际上不那么愚蠢了.与自由胡椒@ShutTheHellUp("未选中")一起; 谢谢你的回应. (2认同)

Jon*_*eet 7

您正在尝试声明一个"通用字段" - 一个具有类型参数的字段.Java中没有这样的概念 - 只有方法和类型才能引入类型参数.

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