第 31 页演示文稿中的示例
class Foo<T> {
public function add(T $delta): Foo {
$this->num += $delta; // line 6
return $this;
}
public function get(): T {
return $this->num;
}
public function __construct(private T $num): void {}
}
$f1 = new Foo(123);
$f1->add(567);
echo $f1->get(), PHP_EOL;
$f2 = new Foo(1.23);
echo $f2->add(5.67)->get(), PHP_EOL;
错误
可捕获的致命错误:黑客类型错误:示例.php第 6 行的键入错误
问题出在哪里?
嘻哈虚拟机 3.11.1 (rel)
编译器: 标签/HHVM-3.11.1-0-g64d37362bc0b6aee919492ad61cf65ce0a5d5e92
存储库架构:8b80ba45250a6669cd610c189dbbb55b6218c2a3
如果您运行类型检查器 ( hh_client
),您将收到如下错误:
这是一个数字,因为它用于算术运算。它与泛型类型 T 的值不兼容
这是因为+
运算符要求双方都是 num 类型,但T
可以是任何类型。
您可以向T
添加一个约束,以便它必须是num
(class Foo<T as num>
),或者您可以只使用 num
作为类型而不是泛型T
。
使用 num
将允许您在同一实例中混合浮点数和整数。使用约束,实例只能使用浮点数或整数,而不能同时使用两者。