天天看點

《Hack與HHVM權威指南》——2.3 類型消除

本節書摘來自華章出版社《hack與hhvm權威指南》一書中的第2章,第2.3節,作者 owen yamauchi,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

泛型是非常純正的類型檢查器級别的結構體,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代碼段中在一個類名的位置使用它,例如:

在一個靜态屬性值的類型上使用它,例如:

<code>class someclass&lt;t&gt; {</code>

// 也是非法的,因為這個屬性并沒有初始化,

// 但這裡并沒有可能的任何合法初始值

當類型形參被用作類型标注時,它們在運作環境中并非是強制實作的。在本例中,我們使用了耦合模式,是以在函數f()内的方法調用上類型檢查器不會報告任何錯誤。

// 下面的所有調用都會有類型檢查錯誤

// 但這個檔案是解耦模式的

// 沒有運作時錯誤

<code>$gc-&gt;takes_type_param('a string');</code>

// 運作時錯誤:可捕獲的緻命錯誤