<typearg>methodname
jest składnia jednoznacznie określający typ argumentu dla metody rodzajowe
Podczas korzystania rodzajowe klasy, zwykle trzeba określić typ argumentu (np String
):
ArrayList<String> list = new ArrayList<String>();
W przypadku metody ogólnej zwykle nie podaje się argumentu typu:
public static <T> void foo(T param) { }
...
String s = ...;
MyClass.foo(s);
Nie zauważysz, gdzie to zrobiliśmy, kod jawnie określa, że chcemy mieć wersję String
z foo
, tj. Nie było jawnego typu argumentu <String>
określonego tak, jak widzieliśmy podczas korzystania z klasy ogólnej (List<String>
).
Kompilator robi trochę magii kompilatora, aby wywnioskować ogólny typ argumentu na podstawie kontekstu. To wspaniała rzecz i bardzo potężna.
Jednak od czasu do czasu kompilator nie można wywnioskować argumentów typu automatycznie:
public static <T> void bar() { T myLocalVar = ...; ... }
MyClass.bar();
Jakie konkretne wersja bar
my staramy się powołać, to co jest argument typu do tej rozmowy? Dunno? Cóż, kompilator też nie.Musimy wyraźnie określać typ argumentu, tak jak zwykle zrobić przy użyciu rodzajowe Klasa:
MyClass.<String>bar();
Zobacz także:
marginesie: może warto wspomnieć, że Java 7 będzie dodanie tzw operator diamentowy, co pozwala nam mieć kompilator wywnioskować argumentów typu przy użyciu klas generycznych teraz też:
ArrayList<String> list = new ArrayList<String>();
staje
ArrayList<String> list = new ArrayList<>();
What is the point of the diamond operator in Java 7?
Dla mojej własnej ciekawości - czy trzeba to wyraźnie stwierdzić, ponieważ te metody są statyczne? – christophmccann
@ Christopher: nie. Działa zarówno w metodach statycznych, jak i niestatycznych. –
Należy to wyraźnie określić, ponieważ jest statyczne, więc nie ma konstruktora, który naprawił argumenty typu ogólnego, a argumentów typu ogólnego nie można wywnioskować z listy parametrów. –