泛型:类·学习笔记

"嗨!我要继续艾莉的泛型课程。准备好听了吗?"

"是的。"

"那我们开始吧。"

"你需要知道的第一件事是类的方法也可以有自己的类型参数。"

"我知道。"

"不,我特指自己的类型参数: "

例子

复制代码
class Calculator
{
  T add(T a, T b); // Add
  T sub(T a, T b); // Subtract
  T mul(T a, T b); // Multiply
  T div(T a, T b); // Divide
}

"这些类型参数专门与方法有关。该类没有参数。您甚至可以将这些方法声明为静态的,并在没有对象的情况下调用它们。"

"我明白了。方法中的类型参数的意义与类相同?"

"是的。但是有一些新东西。"

"正如你已经知道的,你可以在类型声明中使用通配符。那么想象一下以下情况:"

示例 1

复制代码
public void doSomething(List<? extends MyClass> list)
{
 for(MyClass object : list)
 {
  System.out.println(object.getState()); // Everything works well here.
 }
}

"但是如果我们想向集合中添加一个新项目怎么办:"

示例 2

复制代码
public void doSomething(List<? extends MyClass> list)
{
 list.add(new MyClass()); // Error!
}

"问题在于,在一般情况下,可能会向 doSomething 方法传递一个列表,该列表的元素不是 MyClass 对象,而是 MyClass 的任何子类的对象。但是您不能将 MyClass 对象添加到这样的列表中!"

"啊。那么,那有什么办法呢?"

"没什么。在这种情况下,你什么也做不了。但这给了 Java 的创造者一些思考。他们想出了一个新的关键字:super。"

"语法看起来几乎一样:"

复制代码
List<? super MyClass> list

但是 extends 和 super 之间有一个重要的区别。

"<<? extends T>> 表示该类必须是 T 的后代。"

"<<?super T>> 意味着该类必须是 T 的祖先。"

"我的天啊。那这东西用在什么地方?"

"<<? super T>> 在方法涉及添加到 T 对象的集合时使用。在这种情况下,它可以是 T 对象的集合或 T 的任何祖先。"

"啊。可以将 AT 对象分配给类型为 T 的任何祖先的引用变量"

"老实说,这种方式用得并不多,而且还有一个缺点,比如:"

例子

复制代码
public void doSomething(List<? super MyClass> list)
{
 for(MyClass object : list) // Error!
 {
  System.out.println(object.getState());
 }
}

public void doSomething(List<? super MyClass> list)
{
 list.add(new MyClass()); // Everything works well here.
}

"现在第一个例子行不通了。"

"因为 list 甚至可以是 List<Object>(Object 是 MyClass 的最顶层超类),我们实质上是在编写以下无效代码:"

示例 1

复制代码
List<Object> list; 

for(MyClass object : list) // Error!
{ 
 System.out.println(object.getState()); 
}

"我明白了。谢谢你有趣的课。"

"不客气。"

相关推荐
其美杰布-富贵-李7 分钟前
Spring Boot 依赖注入说明文档
java·spring boot·python
tachibana212 分钟前
hot100 数组中的第K个最大元素(215)
java·数据结构·算法·leetcode
our_times17 分钟前
2026年Java开发者破局指南:Spring AI 2.0 与 Agent 开发实战
java·人工智能·spring
糖果店的幽灵1 小时前
langgraph的四种state解析
java·前端·javascript·langgraph
杨充1 小时前
4.接口而非实现编程
java·后端·架构
梦梦代码精1 小时前
基于ThinkPHP6 + Vue3的家政预约系统全解析:从LBS定位到自动派单的完整实现
java·docker·开源·php·代码规范
wear工程师1 小时前
@Transactional 标了却没开事务?先看这次调用有没有经过代理
java·spring
Joey_friends1 小时前
指纹authenticate流程图
android·java·c++
郑州光合科技余经理2 小时前
家政O2O平台解析:从0搭建上门预约小程序解决方案
android·java·开发语言·前端·小程序·架构·php
玖玥拾2 小时前
Unity 3D 笔记(十一)UI 框架进阶:栈弹窗交互、BasePanel 基类虚方法、DoTween 界面动画
笔记·3d·unity