Java-Generics-PartVI

本篇内容知识点比较零散,难以组织,想到啥写啥。

类型实参

关于类型实参存在一些规则:

  • 类型实参的类型可以是引用类型、通配符或参数化类型
  • 但对于泛型方法来说,不允许通配符作为类型实参
  • 类型参数也可以作为类型实参
  • 基本类型不允许作为类型实参
  • 类型实参必须符合类型参数边界

上述规则,许多在前些章节中多少提到过。基本类型无法作为类型实参,因为其不属于 Object 类的子类,无法进行泛型擦除。有界/无界通配符实例化的具体规则也在 Java-Generics-PartIII 中有详细描述。

泛型类的类型参数,可以作为类型实参,传入另一个泛型类。

1
2
3
4
5
// 泛型类 A,类型参数 T
class A<T> {
// 用本类的类型参数 T,作为泛型类 List 的类型实参
private List<T> data;
}

使用类型参数作为类型实参,有时会让人觉得十分混乱。

1
2
3
4
5
6
public class Collections {
public static <T> void copy(List<? super T> dest, List<? extends T> src) { // bounded wildcard parameterized types
for (int i=0; i<src.size(); i++)
dest.set(i,src.get(i));
}
}

在上例中,定义泛型方法时声明了类型参数 T,并将其结合了通配符 ? super T,作为 List 泛型类的类型实参。

多通配符

当多个通配符同时出现在多个类型实参上,每个通配符相互独立,可以表示不同的类型。

1
2
Pair< ? , ? > couple = new Pair< String , String >("Orpheus","Eurydike");
Pair< ? , ? > xmas = new Pair< String , Date >("Xmas", new Date(104,11,24));

在上例中,Pair< ? , ? > 表示每个元素可以是任意类型,并且不必相同,当然也可以相同。

边界

边界出现在有界通配符类型参数边界中,容易混淆,在此理清两者的场景和限制。

一个通配符只能有一个边界,而一个类型参数可以有多个边界。通配符可以有一个下界或一个上界,而类型参数没有下界。

1
2
3
4
5
6
class Box< T extends Appendable & Flushable > {
private T theObject;
public Box(T arg) { theObject = arg; }
public Box(Box< ? extends T > box) { theObject = box.theObject; }
...
}

总结

Java 泛型的特性基本介绍完全。实际使用中,令人产生疑惑的更多是因为相似概念的混淆,例如边界的混淆,类型参数和实参的混淆。所以本系列文章在概念介绍和区分上花了很多笔墨,帮助读者在实际情况中区分概念,便于理解。

Java 泛型系列的文章打算在此先停止更新了。原因有很多,首先自身阅读量不得不承认下降了许多,对相关技术内容阅读和钻研的时间少了很多,其次是近半年 LLM 的大力发展,使得笔者开始彷徨,很多技术的事情,大模型做得已经比人类更好,这不得不让人怀疑学习技术的动机和目的。

和许多愿意接触 AI 前沿发展和应用的朋友讨论,大家做事情的方式都从研究某件事怎么做,转变为怎么让 AI 做。笔者同样觉得 AI 发展是必然趋势,如果在日常使用中无法接触相关内容,则有必要花费时间和精力去尝试和学习最新工具的使用,习惯 AI 新环境下的思考和开发模式。

当然学习是不会停止的,只是会把方向更多向 LLM 靠拢。后续更多会更新大模型相关的基础和应用内容。


Java-Generics-PartVI
http://dracoyus.github.io/2026/05/26/Java-Generics-PartVI/
作者
DracoYu
发布于
2026年5月26日
许可协议