0

来自第 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;

错误

可捕获的致命错误:Hack 类型错误:example.php 第 6 行键入错误

问题是什么?


HipHop VM 3.11.1 (rel)

编译器:标签/HHVM-3.11.1-0-g64d37362bc0b6aee919492ad61cf65ce0a5d5e92

回购模式:8b80ba45250a6669cd610c189dbbb55b6218c2a3

4

1 回答 1

2

如果您运行类型检查器 ( hh_client),您将收到如下错误:

这是一个数字,因为它用于算术运算。它与泛型类型 T 的值不兼容

这是因为+运算符要求双方都是num类型,但T可以是任意类型。

您可以添加一个约束T使其必须是num( class Foo<T as num>),或者您可以只num用作类型而不是泛型T

使用num将允许您在同一实例中混合浮点数和整数。使用约束,实例只能使用浮点数或整数,但不能同时使用两者。

于 2016-02-09T00:34:33.503 回答