Там две вещи в игре здесь:
- Дженерики не овеществленный, поэтому среда не имеет никакой информации о них. Это означает, что время выполнения проверяет только то, что вы возвращаете
Vector
.
$this->vector
сам не набирается. Это означает, что средство проверки типов (hh_client
) рассматривает его как неизвестный тип. Неизвестные типы соответствуют всем, поэтому нет проблем с возвратом неизвестного типа, где ожидается Vector<string>
.
Это позволит вам постепенно вводить код. Всякий раз, когда тип неизвестен, проверяющий тип просто предполагает, что разработчик знает, что происходит.
Первое, что я хотел бы сделать, это изменить файл из частичного режима строгого режима, который просто включает в себя переход от <?hh
к <?hh // strict
. Это заставляет средство проверки типов жаловаться на любую информацию о отсутствующем типе (а также пару других вещей, например суперглобальных, и вы не можете вызывать не-Hack-код).
Это дает ошибку:
test.hh:6:13,19: Please add a type hint (Naming[2001])
Если затем ввести $vector
в Vector<int>
(private Vector<int> $vector
), hh_client
затем производит:
test.hh:9:16,28: Invalid return type (Typing[4110])
test.hh:8:44,49: This is a string
test.hh:6:20,22: It is incompatible with an int
test.hh:8:44,49: Considering that this type argument is invariant with respect to Vector
который является ошибка, которую вы ожидали. Вы также можете получить эту ошибку, просто добавив тип в $vector
, не перейдя в строгий режим, хотя я предпочитаю писать свой Hack в самом сильном режиме, который поддерживает код.
С более поздними версиями HHVM средство проверки типов вызывается всякий раз, когда запускается код Hack (есть флаг INI, чтобы отключить его), поэтому причиной возникновения несоответствия типа также будет выполнение сбой кода.
Можно ли использовать строгий режим для всех скриптов по умолчанию? – JaSHin
Я тестирую скрипт в строгом режиме, без эффекта. Имущество объявляется как: private Вектор $ vector; Строгий режим включен и подтверждена ошибка ho :( –
JaSHin
@ user3249421 Вы используете 'hh_client' в своем коде? –