В этом случае T
бесполезен.Вы можете изменить подпись на public static int count(Object[] x, Object y)
без какого-либо влияния на аргументы, которые компилятор разрешит ему принять.(Вы можете видеть, что подпись для Arrays.fill()
использует ее в качестве подписи.)
Если мы рассмотрим более простой случай, когда у вас просто есть аргументы типа T
, вы можете увидеть это, поскольку любой экземплярT
также является экземпляром своих суперклассов, T
всегда может быть выведен как его верхняя граница, и он все равно будет принимать те же типы аргументов, что и раньше.Таким образом, мы можем избавиться от T
и использовать вместо него его верхнюю границу (в данном случае Object
).
Массивы в Java работают так же: массивы ковариантны, что означает, что если S
подкласс T
, S[]
является подклассом T[]
.Таким образом, применяется тот же аргумент, что и выше - если у вас есть только аргументы типа T
и T[]
, T
можно заменить его верхней границей.
(Обратите внимание, что это не относится к универсальномутипы, которые не являются ковариантными или контравариантными: List<S>
не является подтипом List<T>
.)