对于类型和泛型的理解

类型

对于强类型语言,我们需要先定义变量类型,再使用变量。


这让我不禁让我想到去吃的肯德基疯狂星期四。肯德基的疯狂星期四里面有8个蛋挞的套餐。通常一盒蛋挞是两个装。因此如果你点了疯狂星期四的套餐,你会收到四个蛋挞盒,共计八个蛋挞。

也就是说,如果你是店员,你需要准备四个盒子来装8个蛋挞。

对于肯德基的店员来说,一个店员能装的蛋挞数量,这是拿到的盒子限制的;但一个盒子只能装两个蛋挞,这是盒子大小限制的;而盒子大小是肯德基规定的。

对于计算机的数据来说,一个整形能存储的数据大小,这是字节数限制的;但一个字节最多能存储255的正整数,这是字节大小限制的(也就是8位);而字节大小是计算机行业规定的。


但肯德基和计算机还有一个很大的不同,就是进制和统计的不同。

肯德基是十进制,四个盒子分别是2、2、2、2。这四个盒子是分别计算。

肯德基合计是2+2+2+2=8,这符合我们的常理。因为我们是分开计算的。

计算机是十六进制,四个字节分别是FF、FF、FF、FF。这四个字节是在一个整体中,为0xFFFFFFFF。

计算机合计是255+65280+16711680+4278190080=4294967295。

因此计算机显得不是那么好看。


泛型

对于面向对象也是,我们总说先定义对象类型,再实例化和使用对象。

但类型并不是对象,而是对象的模板。


假设我们的程序在单线程环境中有一段代码。我们把这段代码看作是一个面包店中一台烘焙饼干的机器。但这家面包店由于电力负载问题,一次只能有一台烘焙饼干的机器在运行。

最开始,人们发明了一个烘焙饼干的机器,但这个机器只能制作小熊形状的饼干。突然人们想吃小兔饼干,于是又发明了另一个机器,但这个机器只能制作小兔形状的饼干。

人们希望有更多的饼干形状。于是出现了越来越多的机器,用于生产不同形状的饼干。这些机器功能都非常单一,一种机器只能生产一种形状的饼干。这些机器有很多非常不方便的地方。我们以小熊饼干机器为例:

  • 机器内部有很多个小熊模具,用于压出饼干形状。如果希望制作有小兔饼干就必须全部替换机器中的小熊模具。
  • 假设制作小熊饼干的机器有潜在问题,那其他所有制作不同形状饼干的机器也可能有潜在问题。
  • 这些不同的机器占据了非常大的空间位置。
  • 维护这些机器非常的复杂和繁琐。

于是人们希望有这样一种机器——这个机器有一个卡槽,在卡槽中放入需要的模具,就可以生成需要形状的饼干。这样只需要一台机器,在适当的时候放入模具,就可以生产需要形状的饼干了。

之后机器真的发明出来了,人们称这台机器为泛型烘焙机。因为它是泛用的。放入小熊模具后,这机器就变成小熊饼干烘焙机;放入小兔模具,这机器就变成小兔饼干烘焙机。


对于程序来说,类型就像是一个烘培用的小熊饼干模具,它本身并不能食用。而用这个模具做出来的小熊饼干才是我们需要的对象,这个对象才有耳朵、有身体躯干、有它的香味、并且可以食用。

因此,泛型更像是类型的模板,也就是模具的模板。我们可以使用小熊模具制造小熊饼干,也可以使用兔子模具制造兔子饼干。我们只需要在卡槽中替换模具就行了。而这个替换模具的位置就是泛型。

泛型就像是占位符,就像泛型烘焙机中放置模具的位置。