我有一个方法可能会返回一个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
*/
}
}
为什么我不能这样做?
答案 0 :(得分:1)
这是因为KeyedIterable
不是只读的,所以不能采用子类型。
例如,A::foo()->toMap()
的类型签名类型为Map<arraykey, mixed>
,但实际类型为Map<int, mixed>
。