Hacklang:无法从 (function(...): keyedIterable<arraykey, mixed>) 返回 Vector)



我有一个方法,它可能返回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>

相关内容

  • 没有找到相关文章

最新更新