本節書摘來自華章出版社《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<t> {</code>
// 也是非法的,因為這個屬性并沒有初始化,
// 但這裡并沒有可能的任何合法初始值
當類型形參被用作類型标注時,它們在運作環境中并非是強制實作的。在本例中,我們使用了耦合模式,是以在函數f()内的方法調用上類型檢查器不會報告任何錯誤。
// 下面的所有調用都會有類型檢查錯誤
// 但這個檔案是解耦模式的
// 沒有運作時錯誤
<code>$gc->takes_type_param('a string');</code>
// 運作時錯誤:可捕獲的緻命錯誤