Экспериментируя с ограничениями на общих функциях в Hack, я ассоциировалась следующее:Hacklang - Возможны ли ограничения типа с константами типов?
<?hh // strict
class Base {}
class Derived extends Base {}
abstract class ImplBase {
abstract const type T as Base;
public function foo<Tf as this::T>(Tf $v): void {}
}
class ImplDerived extends ImplBase {
const type T = Derived;
}
function foo(ImplDerived $v): void {
bar($v);
}
function bar(ImplBase $v): void {
$v->foo(new Base());
$v->foo(new Derived());
}
Принцип достаточно прост: вентиляционная из бетона ImplDerived
, делает проверки типов лечения ImplBase::T
как абстрактный типа в bar
, что может литься в Base
с помощью ограничения или сохраняет ссылку на T = Derived
? Однако, как ни странно, ответ не является ни тем, ни другим. Каждая строка в bar
не может по другой причине:
$v->foo(new Base());
терпит неудачу, потому чтоTf
является «ограниченным зависимого типа<expr#1>::T
[...] со ссылкой наnew Base()
».$v->foo(new Derived());
терпит неудачу, потому что пуф!Tf
неожиданноBase
! «[this::T]
- объект типаBase
[...] в результате расширения постоянной типаImplBase::T
».
Я прошу невозможного или это возможно еще не реализовано полностью?