ja nie całkowicie zgadzam się z przyjętą odpowiedzi, w którym jest napisane:
w takim przypadku trzeba dać kompilator trochę pomocy jawnie wskazując oczekiwany typ zwrotu.
To nie brzmi dobrze dla mnie. Ponieważ rozumiem metodę ogólną i wnioskowanie typu, typ podany w nawiasach kwadratowych nie wskazuje bezpośrednio na typ powrotu metody ogólnej. Typem typu T
może być typ zwracany, typ argumentu, typ zmiennej lokalnej powiązany z metodą ogólną.
W rzeczywistości, dzięki mechanizmowi wnioskowania typu, w większości przypadków nie trzeba określać parametru typu T
(nie tylko w niektórych sytuacjach). W twoim przykładzie, <T>
można bezpiecznie pominąć w wywołaniu metody ObjectGenerator.<T> getObject(objectName)
, jak w większości innych przypadków. Dzieje się tak dlatego, że typ T
metody ogólnej można łatwo wywnioskować z typu, do którego wynik jest przypisany, lub zwrócić. Innymi słowy, ponieważ deklarujesz private T object
przed wywołaniem metody, typ T
zostanie pomyślnie wywnioskowany jako T
.
Moje roszczenie może być wsparte przez następujące oświadczenie od a definitive tutorial:
Rodzaj wnioskowanie jest zdolność kompilatora Java, aby spojrzeć na każdej metody inwokacji i odpowiadające im zgłoszenie, aby określić typ argumentu (lub argumenty) które sprawiają, że inwokacja ma zastosowanie. Algorytm wnioskowania określa typy argumentów i, jeśli jest dostępny, typ, dla którego wynik jest przypisywany lub zwracany. Wreszcie, algorytm wnioskowania próbuje znaleźć najbardziej konkretny typ , który działa ze wszystkimi argumentami.
Dwa przykłady dotyczące sposobu działania wnioskowanie:
static <T> T pick(T a1, T a2) { return a2; }
Serializable s = pick("d", new ArrayList<String>());
typu T
jest wywnioskować jak Serializable
na podstawie zadeklarowanego typu cesjonariuszem.
public static <U> void addBox(U u, java.util.List<Box<U>> boxes) {}
BoxDemo.<Integer>addBox(Integer.valueOf(10), listOfIntegerBoxes);
typu U
wnioskuje jak Integer
podstawie rodzaju przechodzi argument (tj. Integer.valueOf(10)
jest typu Integer
). Dlatego też <Integer>
można bezpiecznie pominąć w powyższym wywołaniu metody.
Podsumowując, chyba że nie jesteśmy w stanie wywnioskować parametru typu metody ogólnej od jego typu argumentu lub typu, któremu przypisywany jest wynik lub zwracany (podczas wywoływania metody), możemy bezpiecznie pominąć specyfikację typu tuż przed wywołaniem metody.
+1, ponieważ wcześniej tego nie widziałem. –
Nie pytam o sens, ale o jedną linię kodu. Mogę zmienić podpis metody na ' T getObject (nazwa łańcucha, klasa clazz)' - to nie ma znaczenia. Tylko ta jedna linia z inwokacją tej metody z '' jest myląca dla mnie –
emka86