W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
通過(guò)泛型參數(shù)化類型的能力為開(kāi)發(fā)人員和代碼用戶提供了強(qiáng)大的可讀性優(yōu)勢(shì)。它還提供了typechecker必要的信息,以確保您是代碼的方式。例如,將Box<int>函數(shù)作為參數(shù)類型清楚地顯示了Box應(yīng)包含的類型,類型檢查器也可以使用這些信息。
但是,除了異步函數(shù)的返回類型(Awaitable),對(duì)泛型的支持只能通過(guò)類型注釋在類型分類器上進(jìn)行 ; 它們?cè)谶\(yùn)行時(shí)不存在。泛型類型參數(shù)和參數(shù),并在執(zhí)行之前剝離(即擦除)。使用我們Box上面的例子,這意味著B(niǎo)ox<int>真正Box在運(yùn)行時(shí),HHVM將允許你傳遞非int Box函數(shù)。
<?hh
namespace Hack\UserDocumentation\Generics\Erasure\Examples\TypeErasure;
class Box<T> {
private T $x;
public function __construct(T $x) {
$this->x = $x;
}
public function get(): T {
return $this->x;
}
}
function foo(Box<int> $b): void {
var_dump($b);
}
function run(): void {
$b = new Box(4);
$c = new Box("hi");
foo($b);
foo($c);
}
run();
/*****
* Typechecker error:
*
* File "type-erasure.php", line 23, characters 7-8:
* Invalid argument (Typing[4110])
* File "type-erasure.php", line 15, characters 18-20:
* This is an int
* File "type-erasure.php", line 21, characters 16-19:
* It is incompatible with a string
* File "type-erasure.php", line 15, characters 18-20:
* Considering that this type argument is invariant with respect to Hack\UserDocumentation\Generics\Erasure\Examples\TypeErasure\Box
****/
Output
object(Hack\UserDocumentation\Generics\Erasure\Examples\TypeErasure\Box)#1 (1) {
["x":"Hack\UserDocumentation\Generics\Erasure\Examples\TypeErasure\Box":private]=>
int(4)
}
object(Hack\UserDocumentation\Generics\Erasure\Examples\TypeErasure\Box)#2 (1) {
["x":"Hack\UserDocumentation\Generics\Erasure\Examples\TypeErasure\Box":private]=>
string(2) "hi"
}
雖然通用參數(shù)化確實(shí)是一個(gè)很大的好處,但是由于運(yùn)行時(shí)的類型擦除,您需要注意一些限制。類型參數(shù)T不能在以下情況下使用:
對(duì)于實(shí)例化,類范圍和instanceof用法的可能替代,Hack提供了一個(gè)叫做Classname<T>擴(kuò)展PHP表示的構(gòu)造Foo::class。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: