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

    xiaoxiao2024-08-14  103

    本节书摘来自华章出版社《Hack与HHVM权威指南》一书中的第2章,第2.3节,作者 Owen Yamauchi,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

    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'); }
    最新回复(0)