io non del tutto d'accordo con la risposta accettata, in cui si dice:
in tal caso, è necessario dare al compilatore un piccolo aiuto da parte esplicitamente indicando il tipo di reso che ti aspetti.
Questo non mi sembra giusto. Come comprendo il metodo generico e l'inferenza del tipo, il tipo fornito tra parentesi quadre non indica direttamente il tipo di ritorno del metodo generico. Piuttosto, il tipo T
potrebbe essere il tipo restituito, il tipo di argomento, il tipo di variabile locale associato al metodo generico.
In realtà, grazie al meccanismo di inferenza del tipo, non è necessario specificare il parametro tipo T
nella maggior parte dei casi (non solo in alcune situazioni). Nel tuo esempio, il <T>
può essere tranquillamente omesso dall'invocazione del metodo ObjectGenerator.<T> getObject(objectName)
come nella maggior parte degli altri casi. Questo perché il tipo T
del metodo generico può essere facilmente dedotto da il tipo a cui viene assegnato il risultato o restituito. In altre parole, poiché si dichiara private T object
prima del richiamo del metodo, il tipo T
verrà dedotto correttamente come T
.
La mia domanda può essere sostenuta dalla seguente dichiarazione a definitive tutorial:
tipo inferenza è la capacità di un compilatore Java per guardare ogni metodo invocazione e corrispondente dichiarazione per determinare il tipo argomento (o argomenti) che rendono applicabile l'invocazione. L'algoritmo di inferenza determina i tipi degli argomenti e, se disponibile, il tipo a cui viene assegnato o restituito il risultato. Infine, l'algoritmo di inferenza tenta di trovare il tipo più specifico che funzioni con tutti gli argomenti.
Due esempi su come funziona l'inferenza:
static <T> T pick(T a1, T a2) { return a2; }
Serializable s = pick("d", new ArrayList<String>());
Il tipo T
costituirebbero dunque come Serializable
in base al tipo cessionario dichiarato.
public static <U> void addBox(U u, java.util.List<Box<U>> boxes) {}
BoxDemo.<Integer>addBox(Integer.valueOf(10), listOfIntegerBoxes);
Il tipo U
si inferisce come Integer
base al tipo dell'argomento passato (cioè., Integer.valueOf(10)
è di tipo Integer
). Pertanto, <Integer>
può essere omesso in sicurezza dall'invocazione del metodo di cui sopra.
Per riepilogare, a meno che non si sia in grado di dedurre il parametro di tipo del metodo generico dal tipo di argomento o il tipo di assegnazione o restituzione del risultato (durante il richiamo del metodo), è possibile omettere in modo sicuro la specifica del tipo proprio prima dell'invocazione del metodo.
+1 perché non l'ho visto prima. –
Non mi sto chiedendo in che senso, ma solo su una riga di codice. Posso cambiare la firma del metodo in ' T getObject (String name, Class clazz)' - non importa. Solo questa riga con invocazione di quel metodo con '' mi confonde per me –
emka86