Java中WildcardType的upperBounds与lowerBounds为何是数组?
关于Java泛型类型系统的三个问题
为什么WildcardType的upperBounds和lowerBounds是数组类型?
虽然日常使用通配符时大多是单个边界(比如? extends Number),但从Java泛型的设计逻辑来看:
- 数组形式的设计是为了预留扩展性,和TypeVariable的多边界设计保持结构上的一致性——毕竟TypeVariable允许通过
&指定多个边界(比如<T extends Number & Serializable>)。 - JDK内部的WildcardType实现(如
sun.reflect.generics.reflectiveObjects.WildcardTypeImpl)采用数组存储边界,是为了统一类型处理的逻辑,哪怕当前语法不支持通配符多边界,底层结构也提前兼容了这种可能性。
? extends Number & Serializable这样的写法合法吗?
不合法。Java语法明确规定,通配符的extends仅能跟随一个类型边界,多边界(用&连接多个类型)是泛型参数(TypeVariable)独有的语法。
JDK实现里的toString方法遍历数组拼接&,只是底层结构兼容数组形式的遗留代码,或是和TypeVariable的toString逻辑复用了部分实现,但这并不代表语法允许通配符写多边界。如果在代码中尝试这样写,编译器会直接抛出语法错误。
ParameterizedType的rawType为什么返回Type而非Class?
原因在于rawType(原始类型)的范围不限于Class类型,它可以是其他Type体系中的类型:
- 嵌套泛型场景中,原始类型可能是另一个ParameterizedType,比如
Map<List<String>, Integer>里,List<String>是ParameterizedType,但它的rawType是List(Class);而如果是class Foo<T extends List<String>> { T bar; },bar的类型对应的rawType是TypeVariableT。 - Java的Type体系是为了涵盖所有泛型相关的类型(包括Class、ParameterizedType、TypeVariable、WildcardType、GenericArrayType),用Type作为返回值可以统一接口,让rawType能返回任意合法的原始类型,而不仅仅局限于Class。
内容的提问来源于stack exchange,提问作者FredSuvn
相关产品推荐
相关产品推荐

