super通配符使用避坑指南:3大常见误用场景及正确写法

第一章:泛型 super 通配符的写入限制

在 Java 泛型编程中,`super` 通配符(即 `? super T`)用于限定类型参数的下界,表示实际类型可以是 `T` 或其任意超类。这种通配符常用于支持协变操作,尤其在集合写入场景中具有重要意义。然而,尽管它允许向容器中添加元素,却对读取操作施加了严格的限制。

通配符的使用场景

当使用 `List` 时,该列表可以引用 `List`、`List` 或 `List

List list = new ArrayList();
list.add(42);                // 合法:可以写入 Integer
// Integer i = list.get(0);  // 编译错误:无法确定返回的具体类型
Object o = list.get(0);      // 唯一安全的读取方式是 Object
上述代码展示了 `super` 通配符的核心特性:**写入安全,读取受限**。由于泛型擦除和类型不确定性,编译器无法保证从 `list` 中取出的对象能安全转换为 `Integer`,因此禁止直接赋值给具体子类型。

PECS 原则简述

根据 Joshua Bloch 提出的 PECS(Producer-Extends, Consumer-Super)原则:
  • 如果一个参数化类型仅用于产出 T 实例,应使用 ? extends T
  • 如果仅用于消费 T 实例,应使用 ? super T
通配符形式写入支持读取能力
? super T支持写入 T 及其子类只能读取为 Object
? extends T不支持写入(除 null)可读取为 T
这一机制确保了泛型系统的类型安全性,避免了运行时类型转换异常。开发者应在设计 API 时合理应用 `super` 通配符,以增强灵活性与安全性。

第二章:super通配符的核心原理与边界理解

2.1 super通配符的定义与类型边界解析

super通配符的基本概念
在Java泛型中,`? super T` 表示通配符的下界,即该类型可以是T或其任意父类。这种形式常用于支持写入操作的集合场景。
使用场景与代码示例

List list = new ArrayList();
list.add(100);        // 合法:Integer 是 Integer 的超类之一
// Number item = list.get(0); // 不推荐:返回类型为 Object
上述代码中,`list` 可接受 `Integer` 类型的写入,但读取时只能以 `Object` 类型接收,限制了类型安全性。
类型边界对比
通配符类型适用方向典型用途
? super T消费数据(写入)生产者向容器添加T或其子类实例

2.2 从PECS原则看写入操作的设计意图

在泛型集合的写入操作中,PECS(Producer-Extends, Consumer-Super)原则提供了明确的设计指导。当一个集合用于**消费元素**(即写入),应使用 `super` 限定通配符,以确保类型安全。
写入操作的典型场景
以下代码展示了一个向列表中添加数字的方法:
public static void addNumbers(List list) {
    list.add(1);
    list.add(2);
}
该方法接受 `Integer` 及其父类型(如 `Number` 或 `Object`)的列表。由于 `? super Integer` 表示集合是 **消费者**,可以安全地写入 `Integer` 类型实例。
PECS原则的应用逻辑
  • 使用 ? super T 时,集合作为数据的消费者,适合写入操作;
  • 编译器确保只能写入 T 或其子类,防止类型冲突;
  • 读取时返回类型为 Object,需谨慎处理。

2.3 类型安全机制如何限制不可控写入

类型安全机制通过静态类型检查阻止非法数据写入,确保变量只能接受预定义类型的值。在编译阶段即可捕获类型错误,避免运行时因数据不一致导致的异常写入。
类型约束防止非法赋值
以 Go 语言为例,类型系统严格限制不同类型的直接赋值:

var age int = 25
var name string = "Alice"

// 编译错误:cannot use age (type int) as type string
name = age 
上述代码在编译时即报错,防止整型数据被误写入字符串变量,有效杜绝了内存层面的不可控写入风险。
结构体字段的访问控制
结合可见性规则,Go 使用大小写控制字段导出:
字段名所在包外可写?说明
ID是大写开头,公开字段
password否小写开头,仅包内可写
此类设计从语言层面实现了写入权限的最小化控制。

2.4 编译时检查与运行时行为对比分析

在现代编程语言设计中,编译时检查与运行时行为的权衡直接影响程序的可靠性与执行效率。静态类型语言如Go通过编译期验证类型安全,显著降低运行时错误。
编译时检查的优势
  • 提前发现类型错误,避免运行时崩溃
  • 提升代码可维护性与重构安全性
  • 优化性能,减少运行时类型判断开销
运行时行为的灵活性
动态行为允许延迟绑定和反射操作,适用于高度抽象的场景。例如:

var data interface{} = "hello"
str, ok := data.(string) // 类型断言,运行时检查
if ok {
    fmt.Println(len(str))
}
该代码在运行时判断接口实际类型,体现了动态类型的灵活性,但错误只能在执行时暴露。
对比总结
维度编译时检查运行时行为
错误检测早晚
性能高低
灵活性低高

2.5 常见编译错误及其根本原因解读

在实际开发中,理解编译错误的根本原因比修复错误本身更重要。许多错误源于类型不匹配、符号未定义或作用域问题。
典型错误示例

package main

func main() {
    println(x)  // 错误:未声明的变量 x
}
上述代码触发“undefined: x”错误,根源在于变量未声明即使用。Go 要求所有标识符必须显式声明,编译器无法推断未定义符号。
常见错误分类
  • 语法错误:如缺少分号、括号不匹配
  • 类型错误:如将 string 传递给期望 int 的函数
  • 链接错误:函数已声明但未定义,导致链接阶段失败
这些错误通常源于对语言规范理解不足或拼写疏忽,需结合编译器提示精准定位。

第三章:典型误用场景深度剖析

3.1 向? super T集合中读取元素导致的类型转换风险

在使用泛型通配符 `` 时,主要目的是向集合中写入 `T` 类型或其子类对象,从而保证类型安全。然而,若尝试从中读取元素并进行强制类型转换,则会带来严重的类型转换风险。
读取操作的局限性
由于 `? super T` 只确定了类型的下界,编译器无法确定具体的类型,因此从该集合中读取的元素只能被视为 `Object` 类型。

List list = new ArrayList();
list.add(42);                    // 合法:Integer 是 Number 的子类
Object obj = list.get(0);
Integer num = (Integer) obj;     // 风险:运行时可能抛出 ClassCastException
上述代码中,虽然添加 `Integer` 是安全的,但读取时需强制转型。若实际存储的是 `Double` 等其他 `Number` 子类,转型将失败。
  • 允许写入 `T` 或其子类型,确保生产者安全;
  • 禁止读取为 `T` 类型,因具体类型未知;
  • 唯一安全的读取返回类型是 `Object`。

3.2 尝试写入非子类对象引发的编译失败案例

在泛型集合操作中,若尝试将非子类对象写入限定类型的容器,将触发编译期类型检查失败。Java 的泛型机制通过类型擦除与边界检查保障集合安全性。
典型错误代码示例

List<Integer> numbers = new ArrayList<>();
numbers.add("hello"); // 编译错误:String 不能赋值给 Integer
上述代码中,`List` 仅接受 `Integer` 或其子类实例。由于 `String` 与 `Integer` 无继承关系,编译器拒绝该写入操作,防止运行时类型污染。
类型安全机制分析
  • 泛型在编译期插入强制类型转换指令
  • 禁止跨无关类型写入,避免堆污染(Heap Pollution)
  • 确保协变与逆变使用符合 PECS 原则

3.3 混淆extends与super在写入场景中的角色错位

在泛型集合的写入操作中,`extends` 与 `super` 的语义差异常被忽视,导致类型安全问题。
常见误用场景
开发者常误认为 `List` 可用于添加 `T` 的子类实例,但实际上其元素类型是未知的扩展类型,禁止写入。

List list = new ArrayList<Integer>();
// 编译错误:无法向 ? extends 类型写入
list.add(new Integer(1)); // ❌
该代码无法通过编译,因为编译器无法确定实际类型是否兼容。
正确使用 super 实现写入
应使用 `List` 来确保目标列表能接收 `Integer` 及其子类。

List list = new ArrayList<Number>();
list.add(42); // ✅ 正确:Integer 是 Number 的子类
此时写入安全,因上界为 `Number`,保证了类型包容性。
  • ? extends T:适用于只读场景,生产者(Producer)
  • ? super T:适用于写入场景,消费者(Consumer)

第四章:正确使用模式与最佳实践

4.1 在方法参数中安全接收并写入数据的标准范式

在构建可维护且健壮的后端服务时,方法参数的数据接收与写入必须遵循严格的安全范式,防止注入攻击与无效数据污染。
输入验证优先
所有外部输入应在进入业务逻辑前完成结构与合法性校验。使用结构体标签配合反射机制进行自动化验证是常见做法。

type UserData struct {
    Name  string `validate:"required,min=2"`
    Email string `validate:"required,email"`
}

func SaveUser(data UserData) error {
    if err := validate.Struct(data); err != nil {
        return fmt.Errorf("invalid input: %v", err)
    }
    // 安全写入数据库
    return db.Insert("users", data)
}
上述代码通过 validate 标签声明约束,确保参数满足业务规则后再执行持久化操作。参数 Name 必须存在且不少于两个字符,Email 需符合邮箱格式。
防御性拷贝与不可变传参
对于引用类型(如切片、map),应避免直接写入原始参数,采用深拷贝隔离外部可变状态。
  • 始终假设调用方可能传递恶意或不稳定数据
  • 对指针参数执行非空检查
  • 敏感字段如密码应立即哈希,不在内存中明文留存

4.2 结合具体业务场景实现灵活又安全的集合填充

在电商库存同步场景中,需将外部API返回的商品列表安全地填充至本地集合,同时避免空指针与类型异常。
数据校验与安全填充
采用泛型约束与空值检查确保集合元素合法性:

public <T extends Product> List<T> safeFill(List<T> target, List<T> source) {
    if (source == null || source.isEmpty()) return target;
    for (T item : source) {
        if (item != null && item.isValid()) { // 防止无效对象注入
            target.add(item);
        }
    }
    return target;
}
上述方法通过泛型限定只接受继承自Product的类型,isValid()执行业务校验(如SKU非空、价格大于0),确保填充数据符合业务规则。
并发环境下的线程安全处理
使用Collections.synchronizedList包装目标集合,防止多线程写入冲突,提升系统健壮性。

4.3 利用私有方法封装写入逻辑提升代码可维护性

在大型应用中,数据写入操作往往涉及校验、格式化、日志记录等多个步骤。将这些逻辑直接嵌入公共方法会导致代码重复且难以维护。
封装写入流程
通过私有方法集中管理写入细节,公共接口仅负责参数传递与结果返回,提升职责清晰度。

func (s *DataService) WriteData(input string) error {
    if err := s.validate(input); err != nil {
        return err
    }
    return s.writeInternal(input)
}

func (s *DataService) writeInternal(data string) error {
    formatted := strings.TrimSpace(data)
    log.Printf("Writing data: %s", formatted)
    // 实际写入逻辑
    return nil
}
上述代码中,writeInternal 为私有方法,封装了格式化与日志等细节,避免在多个写入点重复实现。
优势分析
  • 降低公共方法复杂度
  • 便于统一修改写入行为
  • 增强单元测试可覆盖性

4.4 泛型方法与super通配符协同使用的进阶技巧

在Java泛型编程中,`super`通配符(`? super T`)常用于限定类型下界,结合泛型方法可实现灵活的数据写入操作。这种组合特别适用于需要向集合中安全添加元素的场景。
泛型方法中的super通配符应用
考虑一个将元素批量添加到目标集合的方法,使用`? super T`确保目标集合能容纳T及其子类型的元素:

public static <T> void copyTo(List<T> src, List<? super T> dest) {
    for (T item : src) {
        dest.add(item); // 合法:dest可接受T类型
    }
}
该方法接受任意源列表和其超类目标列表,增强了API的兼容性。`dest`虽不能读取具体类型(只能为Object),但可安全写入T实例。
使用场景对比
场景通配符类型适用操作
读取数据? extends T生产者(Producer)
写入数据? super T消费者(Consumer)

第五章:总结与泛型设计思维升华

从重复代码到通用逻辑的跨越
在大型系统开发中,常遇到多个类型执行相似操作的场景。例如,在微服务间传递响应体时,不同服务返回的数据结构一致,但数据类型各异。使用泛型可统一处理:

type Response[T any] struct {
    Code    int    `json:"code"`
    Message string `json:"message"`
    Data    T      `json:"data"`
}

func Success[T any](data T) Response[T] {
    return Response[T]{Code: 200, Message: "OK", Data: data}
}
泛型在集合操作中的实战价值
Go 标准库虽未内置泛型集合,但可通过自定义实现安全高效的通用结构。以下为一个线程安全的泛型缓存示例:
方法功能描述
Set(key, value)存入泛型值,支持任意可比较类型作为 key
Get(key)获取对应值,返回是否存在标志
Clear()清空所有条目
  • 使用 sync.RWMutex 保证并发安全
  • 键类型 K 需满足 comparable,值类型 V 可为任意类型
  • 避免了 interface{} 带来的类型断言开销与运行时错误
设计模式与泛型的融合
工厂模式结合泛型可实现类型安全的对象创建。例如构建数据库连接适配器:

func NewAdapter[T DBAdapter](cfg Config) (T, error) {
    var adapter T
    // 根据配置初始化具体实现
    return adapter, nil
}
该方式消除了传统工厂中 switch-case 类型判断,提升可维护性。实际项目中,某支付网关通过此模式支持十余种通道扩展,新增通道无需修改核心逻辑。
Java 之泛型通配符 ? extends T 与 ? super T 通配符解惑 ? super T 阅读详情

相关推荐

泛型通配符:增强泛型灵活性

摘要: 泛型通配符是泛型编程中的核心概念,分为三类:无界通配符(<?>)可匹配任何类型;上界通配符(<? extends T>)限定为T及其子类,适合读取数据;下界通配符(<? super T>)限定为T及其父类,适合写入数据。合理使用通配符能提升代码通用性,但需注意限制:上界通配符不可写入,下界通配符读取时需转为Object。通过示例代码展示了通配符的正确使用场景及常见错误,帮助开发者编写更灵活的泛型程序。

fykam的博客 1420

【Java集合编程避坑指南】:正确使用super通配符提升代码健壮性

掌握Java泛型的super通配符用法,有效解决集合类型安全与灵活性问题。适用于上界限定、方法参数设计等场景,提升代码复用性与健壮性。深入解析PECS原则与实际案例,值得收藏。

CodeIsle的博客 715

Java-泛型编程-使用通配符? extends 和 ? super

泛型中使用通配符有两种形式:子类型限定<? extends xxx>和超类型限定<? super xxx>。

NowOrNever 1万+

Java 通配符详解:?、? extends、? super 一篇搞懂

本文深入解析Java泛型中的通配符(Wildcard)机制,重点讲解无界通配符(?)、上界通配符(? extends T)和下界通配符(? super T)的用法与区别。文章从泛型不变性切入,指出通配符作为解决"泛型类型不确定"问题的关键工具。通过示例代码详细说明:无界通配符适用于只读场景,上界通配符支持安全读取,下界通配符允许安全写入。特别强调PECS原则(Producer Extends, Consumer Super)作为选择通配符的核心准则,并列举常见误区与解决方案。最终总结三类

qq_40303030的博客 1586

Java泛型通配符?extends与?super的区别与使用场景

我们的目的是让大家清楚地了解Java泛型通配符中?extends和?super的不同之处,以及在什么情况下使用它们。范围主要涵盖这两个通配符的原理、区别和实际应用场景。首先我们会用有趣的故事引入泛型通配符的概念,然后详细解释核心概念,接着分析它们之间的关系,再通过代码示例展示具体的操作步骤,最后介绍实际应用场景、未来发展趋势等内容。Java泛型:就像一个神奇的盒子,这个盒子可以装不同类型的东西,但在使用的时候可以规定它只能装某一类特定的东西。通配符。

AI开发架构师 1015

API安全攻防实战:从信息搜集到漏洞利用的完整路径

本文详细解析了API安全攻防实战的全过程,从信息搜集到漏洞利用,涵盖了渗透测试的核心技巧和工具使用。通过真实案例展示如何发现和利用API漏洞,如HTTP方法滥用、内容类型转换攻击等,并提供企业级防御策略和测试心得,帮助安全研究人员提升API安全防护能力。

weixin_30394981的博客 434

泛型通配符详解:<? extends T> 与 <? super T > 的正确使用场景

泛型通配符是Java高级类型系统的核心部分。extends T>适用于数据来源(读取),而super T>适用于数据去向(写入)。当需要从集合获取数据时,优先使用extends T>。当需要向集合添加数据时,优先使用super T>。正确应用能提升代码的健壮性和可维护性,避免类型错误。实践中,多测试边界情况,确保编译时类型安全。通过本文的示例和解释,您可以自信地在项目中部署这些通配符。

2501_93877399的博客 721

学习C++的递归函数(包含汉诺塔讲解)

简单来讲,递归函数就是函数本身自己调用自己,那么函数又是什么呢?#include <stdio.h> //这行是头文件,不同的头文件可以用不同的函数int main() //这里就是一个main函数//这里是你要编写程序的内容return 0;(这是个小细节如下)所以我们平时用来练习的就是一个main函数,而且是一个整型类型的函数,而这也是最后一句话为什么要加一句 return 0;了,因为它最后要返回整数类型,其它整数也可以,但是大家规定为0,这是C++自带的函数。

2302_81032013的博客 2594

Java泛型通配符深度解析:无限定、上界、下界通配符全面掌握

泛型通配符如同一个无形的手,操控着程序的行进方向,让程序的逻辑更加严密,更加安全。泛型通配符,顾名思义,它是泛型的一种特殊形式,用于表示各种类型的泛型。你可能会问,为什么我们需要它呢?其实,当我们在开发过程中,经常会遇到一种情况,就是我们无法确定一个集合的具体类型,或者我们需要表示任何类型的情况,这时候,泛型通配符就派上了用场。它的出现,不仅让我们的代码更加灵活,而且也让我们的程序更加健壮。在接下来的内容中,我们将会深入探讨泛型通配符的各种形式,包括无限定通配符、上界通配符和下界通配符。

万猫学社 3787

Optisystem软件与Matlab软件的联合数据读取

目录 Matlab软件程序编写 Optisystem软件的连接与设置 数据读取结果 Matlab软件程序编写 利用Matlab软件按照下图编写程序,保存为getdata.m文件。 OutputPort1 =InputPort1; fileID=fopen('OSAdata.txt','wt'); fprintf(fileID,'%f\n',OutputPort1.Sampled.Signal); fclose(fileID); Optisystem软件的连接与设置 (以基于线性插值法

Vivian_Chen_的博客 4853

MIKE21 教程 3.2 随空间变化的网格文件制作(.dfsu文件制作) 曼宁值网格文件制作

上一节讲解了如何制作时间序列文件。本节讲解如何制作仅随空间变化的文件。 目录 1 数据准备 1.1 基于地形设置 1.2 基于地形水深设置: 2 数据导入 3 数据导出

Hello Word 3940

通配符<? extends T>和<? super T>区别及使用场景

<? extends T> : 上界通配符(Upper Bounds Wildcards) <? super T> : 下界通配符(Lower Bounds Wildcards) 平时开发会遇到不少<? extends T>和<? super T>通配符的使用,比如:Collections类提供的集合元素拷贝的copy()方法就同时使用了<? extends T>和<? super T>。 public class Coll..

WLQ0621的博客 4272

【RT-DETR有效改进】手把手带你调参RT-DETR,1:1复现官方版本实验环境

本文是带大家进行调参,利用ultralytics仓库1:1复现RT-DETR官方实验环境,从而在后期发表论文 的时候省去一些不必要的麻烦,例如被审稿人提出质疑,本文的调参内容均有依据,根据RT-DETR官方Github上发布的版本进行设置本文的调参以ResNet18为例,其余的何其的调参基本一致。RT-DETR剑指论文专栏,持续复现各种顶会内容——论文收割机RT-DETR。

Snu77的博客 9928

10分钟理解泛型的通配符(extends, super, ?)

完全不知道类型,只能读取为Object,基本不能写入extends T>:知道是T或其子类,可以安全读取为T,不能写入super T>:知道是T或其父类,可以安全写入T,读取只能当Object记住PECS原则,在设计API时合理使用通配符,可以让代码既安全又灵活。刚开始接触时会觉得复杂,但多练习几次就很容易掌握了。

记录学习路上的每一个 “啊哈!” 时刻 欢迎交流,共同进步! 1071

保研考研机试攻略(满分篇):第二章——满分之路上(1)

保研考研机试攻略(满分篇):第二章——满分之路上(1)2.1计算机和基础+2.2进阶背包问题+2.3毛毛虫算法

qq_63349644的博客 1195

YoloV8改进策略:基于双层路由注意力的视觉Transformer提升YoloV8的检测能力

本文使用2023年最新提出的BiFormer,实现对YoloV8的改进。目前,BiFormer还有在显存占用,还有性能存在问题。我们先试试效果,期待作者在Pytoch上早日实现优化。论文链接:https://arxiv.org/abs/2303.08810代码链接:https://github.com/rayleizhu/BiFormer作为视觉transformer的核心构建模块,注意力是捕捉长程依赖关系的强大工具。

m0_47867638的博客 2845

揭秘泛型中super通配符的写入限制:90%的开发者都踩过的坑,你中招了吗?

掌握泛型 super 通配符的写入限制,避免编译错误。详解其在集合操作中的适用场景与核心原理,揭示90%开发者忽略的关键细节。理解通配符边界规则,提升代码安全性与灵活性,值得收藏。

DeepNest的博客 936

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【Java泛型高级编程】:彻底搞懂super通配符写入限制的5大陷阱与应对策略

掌握泛型 super 通配符的写入限制,深入解析Java泛型中? super T的适用场景与编译原理,揭示5大常见陷阱及安全写入策略,提升代码安全性与灵活性,避免类型错误,值得收藏。

BreakVein的博客 1026

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

《理解 Java 泛型中的通配符:extends 与 super 的使用场景》

`:用于从结构中读取(生产者),不能写入(除了null)``:用于向结构中写入(消费者),只能以Object读取``:当类型完全无关紧要时使用记住PECS原则:Producer-Extends, Consumer-Super恭喜你坚持到了这里!👏 泛型通配符确实是Java中比较复杂的主题,但一旦掌握了它,你就能写出更灵活、更安全的泛型代码。记住,理解extends和super的关键在于思考数据的流向——是生产还是消费。刚开始可能会觉得有点绕,多练习几次就会越来越清晰。

龚小帅的博客 1257

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

泛型中的通配符<?>、<? extends T>、<? super T>的使用场景。ArrayList与LinkedList的区别及适用场景。

用于不关心具体泛型类型的情况,增加灵活性。extends T>:用于读取数据,确保能接收T的子类,常用于方法返回类型限定。super T>:用于写入数据,确保能添加T类型及其子类的对象,常用于方法参数类型限定。这些通配符的使用场景和规则,使得Java的泛型编程更加灵活和强大,同时也保证了类型安全。ArrayList与LinkedList的区别及适用场景。ArrayList与LinkedList在Java集合框架中都是常用的List实现类,它们之间存在明显的区别,这些区别决定了它们各自适用的场景。

weixin_53180424的博客 1286

super通配符使用不当导致类型错误?90%开发者忽略的5个陷阱

掌握Java泛型的super通配符正确用法,避开常见类型错误。详解生产者-消费者场景中的应用、边界限制、类型安全机制及5个易忽略陷阱,提升代码健壮性。避免编译失败与运行时异常,值得收藏。

ByteShoal的博客 948

【Java泛型进阶必修课】:彻底搞懂super通配符的3大核心应用场景

掌握Java泛型的super通配符核心用法,解决类型安全与灵活写入难题。详解适用于集合写入、下界约束和逆变场景的三大应用,提升代码复用性与安全性。深入解析PECS原则,值得收藏。

FastProceed的博客 737

理解Java泛型的复杂写法<? super T>,<? extend T>

“

进击的豌豆的博客 2872

泛型的使用示范-2:通配符 extends 与 super 详解

泛型的使用示范-2 //? extends 类型:用于限制泛型的上限,可以用于声明处,可以用于参数定义处 //? super 类型:用于限定泛型的下限,只能用于参数定义处 class disk<T extends Object> { //extends限定类型的上限 private T data; public disk(T data) { this.data = data;...

liumingxiy的博客 228
上一篇: 【Java字符串处理必知】:深入剖析 lines() 方法对空行的真实行为
下一篇: 【Java 18编码新纪元】:UTF-8默认化背后的Sun JDK到OpenJDK演进秘密
StepLens
博客等级 码龄1年 149粉丝 2031原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值