Этот метод имеет два параметров типа, D
и T
, с D
с дополнительным extends
ограничения, в зависимости от T
. Не путайте этот синтаксис <T,?>,T
; ,T
делает не принадлежит к ограничению, но является вторым параметром, говорящим Java, что T
не является именем конкретного класса.
Если вы добавите пробел или измените параметры, он станет более четким. Вот аналогичный, но несколько более простой пример. Эти сигнатуры методов эквивалентны:
<D extends List<T>,T> D createListOf(Class<T> clazz) // your version
<D extends List<T>, T> D createListOf(Class<T> clazz) // extra space
<T, D extends List<T>> D createListOf(Class<T> clazz) // different order
Имейте в виду, что, хотя это может показаться очевидным, что T
еще один параметр типа, это не ясно Java. Может существовать фактический класс с именем T
, поэтому мы должны быть явным, что T
является параметром типа.
И наоборот, параметры типа не ограничиваются отдельными символами. У вас также может быть параметр типа Foo
или даже String
, если вы хотите полностью смутить своих сотрудников. Возможно, это дает понять, почему необходимо декларировать все параметры типа с использованием <...>
.
// just a deterrent example; don't do this! String as parameter, not class
<String, Foo extends List<String>> Foo createListOf(Class<String> clazz)
Этот метод требует двух параметров типа: 'D' и' T', а 'D' имеет дополнительное ограничение' extends', в зависимости от 'T'. Не путайте это ', T', они не принадлежат друг другу. –