《Hack与HHVM权威指南》——2.3 类型消除

2.3 类型消除

泛型是非常纯正的类型检查器级别的结构体,HHVM几乎完全不知道它的存在注2。事实上,当HHVM运行一段泛型代码的时候,真实的效果就像把所有的类型形参和类型实参都去除。这种行为称为类型消除(type erasure)。
对于泛型实体定义内的类型形参,这里有“关于你什么能做及什么不能做的”的重要结论。对于类型形参,你唯一能做的一件事是在类型标注中使用它。这里你不能对类型形参做某些其他类型可以的事情。例如:
进行实例化,例如new T()。
把它当作作用域使用,例如T::someStaticMethod()、T::$someStaticProperty,或T::SOME_CONSTANT。
把它当作类型实参,例如:在function f(T $value)中。
把它放置在instanceof的右边,例如:在$value instanceof T中。
强制转化为该类型,例如:在(T)$value中。
在catch代码段中在一个类名的位置使用它,例如:

function f<Texc>(): void {
  try {
    something_that_throws();
  } catch (Texc $exception) {??// 错误
    // ...
  }

在一个静态属性值的类型上使用它,例如:
class SomeClass<T> {
// 也是非法的,因为这个属性并没有初始化,
// 但这里并没有可能的任何合法初始值

  public static T $property;
}

当类型形参被用作类型标注时,它们在运行环境中并非是强制实现的。在本例中,我们使用了耦合模式,因此在函数f()内的方法调用上类型检查器不会报告任何错误。

<?hh //ded
class GenericClass<T> {
  public function takes_type_param(T $x): void {
  }
  public function takes_int(int $x): void {
  }
}
function f(GenericClass<int> $gc): void {

// 下面的所有调用都会有类型检查错误
// 但这个文件是解耦模式的

// 没有运行时错误
$gc->takes_type_param('a string');
// 运行时错误:可捕获的致命错误

  $gc->takes_int('a string');
}
时间: 2024-09-20 22:32:15

《Hack与HHVM权威指南》——2.3 类型消除的相关文章

《Hack与HHVM权威指南》——第1章 类型检查

本节书摘来自华章出版社<Hack与HHVM权威指南>一书中的第1章,第1节,作者 Owen Yamauchi,更多章节内容可以访问"华章计算机"公众号查看. 第1章 类型检查 类型检查器是Hack语言的标志特性,它对Hack程序静态地进行分析(不用运行它们),并且能够检查很多种错误.这就能够在程序开发初期尽量避免bug,并且使程序更容易阅读和理解.为了增强类型检查器的能力,Hack语言允许编程人员显式地在程序体中标注某些变量值的类型,比如函数参数.函数返回值和属性值,类型检

《Hack与HHVM权威指南》——1.7.1 提炼nullable类型到non-nullable类型

本节书摘来自华章出版社<Hack与HHVM权威指南>一书中的第1章,第1节,作者 Owen Yamauchi,更多章节内容可以访问"华章计算机"公众号查看. 1.7.1 提炼nullable类型到non-nullable类型 null检查语句在从空值(nullable)的类型到非空值(non-nullable)类型的转变中经常用到.下面是个通过了类型检查器检查的示例. function takes_string(string $str) { // ... } functio

《Hack与HHVM权威指南》——第1章 类型检查1.7 类型提炼

本节书摘来自华章出版社<Hack与HHVM权威指南>一书中的第1章,第1.7节,作者 Owen Yamauchi,更多章节内容可以访问"华章计算机"公众号查看. 1.7 类型提炼 假设你有个?string类型的值,而且准备把这个值传递给一个参数类型为string的函数.那么你怎么把一个类型(?string)转化为另外一个类型(string)呢?或者假设你有个object类型的值,它可能实现或没有实现Polarizable接口.同时,如果它实现了这个接口,你还希望调用这个ob

《Hack与HHVM权威指南》——1.4.1 类型检查器模式

本节书摘来自华章出版社<Hack与HHVM权威指南>一书中的第1章,第1.4.1节,作者 Owen Yamauchi,更多章节内容可以访问"华章计算机"公众号查看. 1.4.1 类型检查器模式 Hack的类型检查器有三种模式:严格(strict).局部(partial)和耦合(decl).这些模式都基于一个个单独的文件,不同模式下的单独文件可以无缝地进行对接.每个文件可以单独声明它的类型检查模式,语法就是在文件的第一行使用一个双斜线的注释.如下面的代码所示:<?hh

《Hack与HHVM权威指南》——1.7 类型提炼

本节书摘来自华章出版社<Hack与HHVM权威指南>一书中的第1章,第1.7节,作者 Owen Yamauchi,更多章节内容可以访问"华章计算机"公众号查看. 1.7 类型提炼 假设你有个?string类型的值,而且准备把这个值传递给一个参数类型为string的函数.那么你怎么把一个类型(?string)转化为另外一个类型(string)呢?或者假设你有个object类型的值,它可能实现或没有实现Polarizable接口.同时,如果它实现了这个接口,你还希望调用这个ob

《Hack与HHVM权威指南》——1.3 类型标注语法

本节书摘来自华章出版社<Hack与HHVM权威指南>一书中的第1章,第1.3节,作者 Owen Yamauchi,更多章节内容可以访问"华章计算机"公众号查看. 1.3 类型标注语法 本节解释了可以使用类型注解语法的三个地方.当然,我们还没有看到Hack所支持的全部类型,这些内容将会在1.4节进行讲述.现在,你需要知晓的就是int和string是有效的类型标注类型.可以使用类型标注的三个地方分别是函数的返回类型.函数的参数和属性值.

《Hack与HHVM权威指南》——1.3.1 函数的返回类型

本节书摘来自华章出版社<Hack与HHVM权威指南>一书中的第1章,第1.3.1节,作者 Owen Yamauchi,更多章节内容可以访问"华章计算机"公众号查看. 1.3.1 函数的返回类型 关于函数返回类型的语法是最简单的,在函数参数列表结束的圆括号后面,添加一个冒号和一个类型名称.你可以在函数或者方法中这样使用,甚至那些没有具体内容的接口和抽象类的方法声明中也可以这样使用.下面是范例:function returns_an_int(): int { // ...}fu

《Hack与HHVM权威指南》——1.6.2 未决的类型

本节书摘来自华章出版社<Hack与HHVM权威指南>一书中的第1章,第1.6.2节,作者 Owen Yamauchi,更多章节内容可以访问"华章计算机"公众号查看. 1.6.2 未决的类型 事实上,如果一个变量没有类型定义的话,那就意味着类型检查器需要一个途径来处理下例中的代码: if (some_condition()) { $x = 10; } else { $x = 'ten'; } 这种模式在PHP中是比较常见的,所以它在Hack中也是合法的.然后问题来了:在这个情

《Hack与HHVM权威指南》——1.5.2 覆盖方法的类型

本节书摘来自华章出版社<Hack与HHVM权威指南>一书中的第1章,第1.5.2节,作者 Owen Yamauchi,更多章节内容可以访问"华章计算机"公众号查看. 1.5.2 覆盖方法的类型 在Hack的代码之间,继承是更加复杂的相互关系中的一种.这复杂性主要来自于当继承关系被创建时,继承和被继承的代码之间的分离现象.举例来说,如果你有个类型标注为SomeClass的对象并可以调用这个对象的某个方法,那么你可以调用继承自SomeClass的任何类的某个方法.这个调用仍然需

《Hack与HHVM权威指南》——1.2 设置类型检查器

本节书摘来自华章出版社<Hack与HHVM权威指南>一书中的第1章,第1.2节,作者 Owen Yamauchi,更多章节内容可以访问"华章计算机"公众号查看. 1.2 设置类型检查器 在正式学习Hack类型注解的语法以及语义之前,我们将首先学习如何设置类型检查器.你需要做的第一件事情就是建立一个.hhconfig文件,这个文件掌控着整个项目范围内的配置项目,它用来标记你的代码库的顶级目录,使得类型检查器能够知晓在它的分析过程中要包含哪些文件.目前来说,我们还不需要什么配置