Если у вас есть обобщенный класс, вы не можете использовать параметры типа в статических методах, поскольку они там не имеют смысла.Например, рассмотрим ArrayList<T>
.Вы можете создать ArrayList<String> stingList = new ArrayList<String>()
и ArrayList<Integer> integerList = new ArrayList<Integer>
.Так что теперь у вас есть экземпляры ArrayList, каждый со своим собственным типом параметра, и методы экземпляра, которые могут использовать преимущества этого типа параметра, такие как get
.Но статические методы принадлежат классу, а не экземпляру, поэтому, когда вы вызываете статический метод, вы вызываете его как ArrayList.staticMethod()
NOT stringList.staticMethod()
или integerList.staticMethod()
(вы также можете сделать это, но на самом деле это не имеет смысла,поскольку статический метод не может получить доступ к переменным экземпляра, он делает то же самое, что и вызов его в классе).Но когда вы вызываете его для класса, классом является просто ArrayList без каких-либо параметров типа, поскольку параметры типа используются только экземплярами.
Однако у вас могут быть методы, которые имеют собственный параметр типа, которыйнезависимо от параметра типа класса, как Томас показывает в своем ответе.Таким образом, вы можете затем вызвать этот метод как ExampleClass.<String> staticMethod()
;обратите внимание, что в ExampleClass здесь нет параметра типа, но у метода он есть.(вы можете опустить <String>
в вызове метода, если компилятор может вывести его из использованных параметров, или тип возвращаемого значения: String s = ExampleClass.method2(new ExampleSubclass<String>())
; обычно он делает довольно хорошую работу при выводе его)