Java-Generics-PartVI
本篇内容知识点比较零散,难以组织,想到啥写啥。
类型实参
关于类型实参存在一些规则:
- 类型实参的类型可以是引用类型、通配符或参数化类型
- 但对于泛型方法来说,不允许通配符作为类型实参
- 类型参数也可以作为类型实参
- 基本类型不允许作为类型实参
- 类型实参必须符合类型参数边界
上述规则,许多在前些章节中多少提到过。基本类型无法作为类型实参,因为其不属于 Object 类的子类,无法进行泛型擦除。有界/无界通配符实例化的具体规则也在 Java-Generics-PartIII 中有详细描述。
泛型类的类型参数,可以作为类型实参,传入另一个泛型类。
1 | |
使用类型参数作为类型实参,有时会让人觉得十分混乱。
1 | |
在上例中,定义泛型方法时声明了类型参数 T,并将其结合了通配符 ? super T,作为 List 泛型类的类型实参。
多通配符
当多个通配符同时出现在多个类型实参上,每个通配符相互独立,可以表示不同的类型。
1 | |
在上例中,Pair< ? , ? > 表示每个元素可以是任意类型,并且不必相同,当然也可以相同。
边界
边界出现在有界通配符和类型参数边界中,容易混淆,在此理清两者的场景和限制。
一个通配符只能有一个边界,而一个类型参数可以有多个边界。通配符可以有一个下界或一个上界,而类型参数没有下界。
1 | |
总结
Java 泛型的特性基本介绍完全。实际使用中,令人产生疑惑的更多是因为相似概念的混淆,例如边界的混淆,类型参数和实参的混淆。所以本系列文章在概念介绍和区分上花了很多笔墨,帮助读者在实际情况中区分概念,便于理解。
Java 泛型系列的文章打算在此先停止更新了。原因有很多,首先自身阅读量不得不承认下降了许多,对相关技术内容阅读和钻研的时间少了很多,其次是近半年 LLM 的大力发展,使得笔者开始彷徨,很多技术的事情,大模型做得已经比人类更好,这不得不让人怀疑学习技术的动机和目的。
和许多愿意接触 AI 前沿发展和应用的朋友讨论,大家做事情的方式都从研究某件事怎么做,转变为怎么让 AI 做。笔者同样觉得 AI 发展是必然趋势,如果在日常使用中无法接触相关内容,则有必要花费时间和精力去尝试和学习最新工具的使用,习惯 AI 新环境下的思考和开发模式。
当然学习是不会停止的,只是会把方向更多向 LLM 靠拢。后续更多会更新大模型相关的基础和应用内容。