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
*/
}
}
なぜ私はこれを行うことができないのですか?