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;

エラー

キャッチ可能な致命的なエラー: ハック タイプのエラー: example.php 行 6 での入力エラー

何が問題ですか?


ヒップホップ VM 3.11.1 (rel)

コンパイラ: tags/HHVM-3.11.1-0-g64d37362bc0b6aee919492ad61cf65ce0a5d5e92

リポジトリスキーマ: 8b80ba45250a6669cd610c189dbbb55b6218c2a3

4

1 に答える 1

2

タイプチェッカー ( ) を実行するとhh_client、次のようなエラーが発生します。

これは算術演算で使用されるため、数値です。ジェネリック型 T の値とは互換性がありません

これは、+演算子が両側が num 型である必要があるためですTが、任意の型にすることができます。

制約を追加しTnum( ) にするか、ジェネリックの代わりに型としてclass Foo<T as num>使用することができます。numT

を使用numすると、同じインスタンスで float と int を混在させることができます。制約を使用すると、インスタンスは float または int のいずれかでのみ機能し、両方では機能しません。

于 2016-02-09T00:34:33.503 に答える