我有一个方法,它可能返回Map或Vector,由于这两种类型都实现了KeyedIterable
-Vector<T>
,具体实现KeyedIterable<int, T>
,所以我认为我可以用KeyedIterable<arraykey, T>
返回类型覆盖这两种情况。然而,即使arraykey
是比int
更通用的类型,这也不起作用。例如,类型检查器抱怨以下代码:
<?hh // strict
class A {
public static function foo(): KeyedIterable<arraykey, mixed> {
return Vector{};
/*
Invalid return type (Typing[4110])
This is an array key (int/string)
It is incompatible with an int
Considering that this type argument is invariant with respect to KeyedIterable
*/
}
}
为什么我不能这样做?
这是因为KeyedIterable
不是只读的,所以不能采用子类型。
例如,A::foo()->toMap()
将具有来自类型签名的类型Map<arraykey, mixed>
,但实际类型为Map<int, mixed>
。