泛型:超级、扩展、列表·学习笔记

"现在介绍一个有趣的新话题:通配符。"

"从本质上讲,这就像一个 <<*>> 模式,可以匹配任何东西。"

"但让我们从头开始吧。"

"想象一下,你有一个 Warrior 类和一个方法来确定两个战士中哪个更强。这看起来可能是这样的:"

示例 1

复制代码
class WarriorManager
{
 public static boolean fight(Warrior w1, Warrior w2)
 {
  return w1.power > w2.power;
 }
}

示例方法调用

复制代码
MagicWarrior mag = new MagicWarrior();
ArcherWarrior archer = new ArcherWarrior();

boolean isMagicCooler = WarriorManager.fight(mag, archer);

"MagicWarrior和ArcherWarrior都继承了Warrior。。 "

"这有点简单,但举个例子,它就可以了。"

"好的。"

"现在假设你已经决定为多个战士加入战斗的情况制定类似的方法。"

示例 1

复制代码
class WarriorManager
{
 public static boolean fight(Warrior w1, Warrior w2)
 {
  return w1.power > w2.power;
 }

 public static boolean fight(List<Warrior> w1, List<Warrior> w2)
 {
  return ...
 }
}

示例方法调用

复制代码
ArrayList<MagicWarrior> magi = new ArrayList<MagicWarrior>();
for(int i = 0; i < 10; i++)
 magi.add(new MagicWarrior());

ArrayList<ArcherWarrior> archers = new ArrayList<ArcherWarrior>();
for(int i = 0; i < 10; i++)
 archers.add(new ArcherWarrior());

boolean isMagicCooler = WarriorManager.fight(magi, archers); // Compilation error!

"但在这里你遇到了一个编译错误,并且对可能出了什么问题感到困惑。"

"关键是MagicWarrior 继承了 Warrior,而 MagicWarrior 对象可以传递给 fight(Warrior, Warrior) 方法。"

"但是List<MagicWarior> 不继承 List<Warrior>。所以,你不能把它传递到那里!"

"你说它不继承是什么意思?"

"我的意思是:一个是List,另一个是List,但它们有类型参数。"

"你说得对。我不知道为什么没有第一时间注意到这一点。那么,这个问题已经有解决方案了吗?"

"是的。你需要使用更复杂的结构。它看起来是这样的:"

示例 1

复制代码
class WarriorManager
{
 public static boolean fight(Warrior w1, Warrior w2)
 {
  return w1.power > w2.power;
 }

 public static boolean fight(List<? extends Warrior> w1, List<? extends Warrior> w2)
 {
  return ...
 }
}

"<<? extends Warrior>> 部分表示 <<任何继承 Warrior 的类型>>"

"换句话说,现在你可以传递一个 List<MagicWarrior> 和一个 List<ArcherWarrior>,一切都会起作用。"

"太厉害了,这种问题越少越好。"

"我也是这种感觉。"

"但是,如果我不需要继承 Warrior 的东西怎么办?如果我希望能够将具有任何类型参数的任何 List 传递给该方法怎么办?这允许吗?"

"是的,有两种形式的符号可以做到这一点:"

复制代码
List<? extends Object>

List<?>

"它们的意思相同,所以通常使用第二个版本。"

"今天就这些了。"

"谢谢你,艾莉,我今天真的学到了很多东西。"

相关推荐
切糕师学AI2 小时前
Elasticsearch RRF(倒数排序融合)技术详解与实践
算法·elasticsearch·搜索引擎·混合搜索·rrf·归一化问题
何故染尘優2 小时前
如何快速判断几十亿个数中是否存在某个数?
java
REDcker2 小时前
C++ 多线程内存模型与 memory_order 详解
java·c++·spring
世人万千丶2 小时前
Flutter 框架跨平台鸿蒙开发 - 鸿蒙护眼版本2048操作式游戏应用
学习·flutter·游戏·华为·harmonyos·鸿蒙
水饺编程2 小时前
第4章,[标签 Win32] :SysMets3 程序讲解05,水平滚动
c语言·c++·windows·visual studio
MegaDataFlowers2 小时前
解决启动Tomcat在idea输出日志乱码问题
java·ide·intellij-idea
lihao lihao2 小时前
进程地址空间
数据结构·c++·算法
七夜zippoe2 小时前
应用安全实践(二):Spring Security核心流程与OAuth 2.0授权
java·安全·spring·security·oauth 2.0
Byte不洛2 小时前
LeetCode双指针经典题
c++·算法·leetcode·双指针