设置通用类类型

5
如何设置泛型类型?例如:
Class<List<Integer>> asd = List<Integer>.class \\ does not work

也许这是一个有些愚蠢的问题,但我从未遇到过这样做的代码。
2个回答

3

编译器拥有所有信息来检查类型是否被正确分配。为什么它要强制让我使用丑陋的抑制警告注释呢?如果(当然)支持语言,我可以指定具体类型而不是使用原始泛型类。然后,在运行时让类型信息被擦除。但是在源代码中,为什么不能明确指定呢? - michael nesterenko
简而言之,运行时类型无法检查,因为类对象(以及它所反映的运行环境)没有用于填充泛型类型的插槽,因为在大多数情况下(并非所有情况),编译器无法确定Class对象的泛型类型... 例如,List<Object>.class将等于List<String>.class,它们都会产生Class<List> = List.class... 因此,即使在您的示例中,asd的类型是Class<List<Integer>>,您也可以使用asd来保存Class<String>或其他类型。在asdfinal的有限情况下,您不需要asd... - BRPocock
你谈论运行时,这在这里并不重要。重要的是在源代码中为泛型类指定具体类型。这是我问题的主要点。你看,我这里不需要运行时能力。 - michael nesterenko
1
换句话说,Class类型或.class符号中没有泛型类型规范的原因是它对创建的代码没有影响。或者,不同的理解方式是:Class<List>表示任何List的方法和属性,而不管它可能包含的特定类型是什么;由于这些方法的签名编译成使用Object的类型,您可以(但不应该)忽略泛型类型规范,例如将String推入List<Integer>(并造成混乱)。 - BRPocock

2
这是不可能的,因为类型擦除。虽然各种库中有许多技巧可以帮助反射,但语言本身对泛型类型的内省支持通常较差。

编译器具有检查类型是否正确分配的所有信息。为什么它要让我使用丑陋的抑制警告注释,而不是(如果语言支持的话)指定具体类型并不使用原始泛型“Class”?然后,在运行时让类型信息被擦除。但在源代码中,为什么不能指定它呢? - michael nesterenko

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