Hacklang:无法从(function(...)返回Vector:KeyedIterable <arraykey,mixed =“”>)

时间:2016-04-02 19:04:35

标签: generics return-type hacklang

我有一个方法可能会返回一个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
      */
   }
}

为什么我不能这样做?

1 个答案:

答案 0 :(得分:1)

这是因为KeyedIterable不是只读的,所以不能采用子类型。

例如,A::foo()->toMap()的类型签名类型为Map<arraykey, mixed>,但实际类型为Map<int, mixed>