技术文摘
Java泛型里super T与extends T的差异
Java泛型里super T与extends T的差异
在Java泛型的世界里,super T和extends T是两个重要且容易混淆的概念,它们在泛型类型的限定上有着不同的作用和应用场景。
首先来看看extends T。当我们使用extends T来限定泛型类型时,它表示该泛型类型必须是T类型或者是T的子类型。例如,我们定义一个泛型方法public static <T extends Number> void print(T t),这意味着传入这个方法的参数t必须是Number类型或者是Number的子类型,比如Integer、Double等。这种限定使得我们可以在方法内部安全地调用Number类中定义的方法,因为传入的对象肯定具有Number类的特性。它主要用于获取泛型对象的值,保证了读取操作的类型安全。
而super T则有着不同的含义。当使用super T来限定泛型类型时,它表示该泛型类型必须是T类型或者是T的父类型。比如public static <T> void add(List<? super T> list, T t),这里的List<? super T>表示这个列表可以存储T类型或者T的父类型的元素。super T常用于向泛型对象中写入数据,因为它确保了写入的数据类型是符合要求的。例如,我们可以将一个Integer对象放入一个存储Number类型或其父类型的列表中。
在实际应用中,extends T更侧重于读取数据,因为它保证了读取到的数据类型是已知的,不会出现类型不匹配的问题。而super T更侧重于写入数据,能够确保写入的数据类型是合适的。
需要注意的是,使用extends T时,不能向泛型对象中写入数据(除了null),因为具体的类型可能是T的某个子类型,写入其他类型的数据可能会导致类型错误。而使用super T时,读取数据时只能将其赋值给Object类型的变量,因为具体的类型是未知的。
理解super T和extends T的差异对于正确使用Java泛型至关重要,能够帮助我们编写更加安全和高效的代码。
- Jekyll 静态网站后台引擎教程
- Ruby 面向对象编程学习笔记
- Ruby 与 Ruby on Rails 中解析 JSON 格式数据实例教程
- 在 Powershell 中请求 WebServices 并输出 JSON 格式结果
- PowerShell 中混淆密码的实现示例
- Ruby 中利用 Nokogiri 包操作 XML 格式数据教程
- Powershell 中阻止“确认提示”的办法
- Ruby 中 XML 格式数据解析库 Nokogiri 的使用深入指南
- Powershell 展开对象数据结构并以 JSON 格式呈现输出
- Ruby 中 REXML 库处理 XML 格式数据的使用指南
- Shell 中通配符的实际运用
- PowerShell 中网卡状态及电源设置的检查
- PowerShell 本地账户添加脚本分享
- 学习 Ruby 必知的相关知识(rvm、gem、bundle、rake、rails 等)
- Ruby 中 %W{} 和 %w{} 的使用案例深度剖析