2009-11-03 19 views
10

Mi confondo quando mi imbatto in un metodo generico di questo tipo.Definizione di <T> in statico pubblico <T> T addAndReturn (elemento T, collezione <T> raccolta) {

public static <T> T addAndReturn(T element, Collection<T> collection){ 
    collection.add(element); 
    return element; 
} 

non riesco a capire il motivo per cui <T> è richiesto in questo metodo.

Inoltre, qual è la differenza tra i metodi generici ei metodi che utilizzano la sintassi generica?

+0

Leggere le linee guida di formattazione prima di inviare la domanda. Sono piuttosto difficili da perdere. – Joe

+1

prova a formattare gli esempi di codice come codice – NDM

+0

@Joe, @Nicky De Maeyer: ho risolto i problemi di formattazione e rimosso il PS. – Asaph

risposta

4

L'alternativa, utilizzando l'oggetto anziché T, causerebbe il ritorno dell'oggetto alla funzione.

Quando ritorna T, si può fare qualcosa di simile:

addAndReturn(myElement, col).SomeMethodOfMyElement(); 

Se addAndReturn restituito oggetto invece, si dovrà utilizzare

((MyElementType)addAndReturn(myElement, col)).SomeMethodOfMyElement(); 

che ha bisogno di un cast esplicito, o

addAndReturn(myElement, col); 
myElement.SomeMethodOfMyElement; 

che richiede due istruzioni invece di una.


EDIT: Ora che la tua domanda è stato formattato, vedo che uno dei parametri è Collection<T>. In tal caso, la sintassi generica garantisce che

addAndReturn(mySquare, collectionOfCircles); 

restituisce un errore di compilazione invece che un errore di run-time.


EDIT: E solo nel caso in cui la tua domanda era sulla sintassi <T> piuttosto che circa l'uso dei farmaci generici in generale: Il <T> dice al compilatore che il T utilizzato nella definizione del metodo è non qualche classe T ma piuttosto un segnaposto per qualunque classe "si adatta" a una chiamata specifica del metodo.

+1

Grazie per l'ultimo commento EDIT. Che cosa è la mia domanda. Tutto quello che ho bisogno di sapere è questo. I seguenti frammenti di codice fanno alcuna differenza per il compilatore? Se é cosi, come? 1. public static T addAndReturn (Collezione collezione) {} 2. T addAndReturn (Collezione collezione) public static {} –

+0

spiacenti. anche questa volta ho perso la mia formattazione. Puoi farmi sapere come faccio a formattare il mio codice in questo? –

+0

Nella seconda variante, il compilatore pensa di creare una funzione che restituisce la classe T. Letterale "T", come in "classe T {...}". Nella prima variante, stai creando una funzione che funziona per le classi * all *: se passi un intero e una collezione , verrà restituito un numero intero. – Heinzi

-1

Ciò è un T generico è semplicemente un segnaposto per il tipo più concreto che viene restituito. Nel caso in cui tu abbia fornito T è il tipo di elemento che stai aggiungendo alla raccolta.

Collection<int> intCollection = new Collection(); 
int addedInt = addAndReturn(5, intCollection); 
addedInt == 5; 

Poiché sono tutti T piuttosto che T1 o T2 devono essere dello stesso tipo di oggetto come un unico tipo è necessaria ovviamente poiché la funzione aggiunge un tipo a un insieme generico

+2

Poiché si tratta di java, speravo che intendessi la raccolta :) – penpen

-1

T è usato Ragioni polimorfe, se possiamo dirlo. T è qualsiasi tipo di classe Type.

Detto questo, se si arriva ad avere una classe Cliente, ad esempio, è possibile utilizzare questo metodo sopra descritto per elaborare il proprio tipo di utente Classe cliente. T ti permette di posizionare in qualsiasi tipo desideri.

T ti consentirà di utilizzare questo metodo generico per i tuoi tipi definiti dall'utente, proprio come farà per i tipi di valore o altri tipi. T diventa il tipo specificato nel parametro elemento.

0

Questo metodo restituisce lo stesso ingresso element probabilmente perché implementatori intendeva usare un Fluent Interface come modo per fornire un API più leggibile:

addAndReturn(myElement, col).doElementStuff().doOtherElementStuff(); 

Here si ha una bella tutorial su generici Java che trovo completa e illuminante .

8
> public static <T> T addAndReturn(T 
> element, Collection<T> collection){ 
>  collection.add(element); 
>  return element; } 

Il <T> (tra parentesi angolari) è noto come il parametro di tipo generico, mentre il T precede direttamente il nome del metodo è il tipo di ritorno. Potresti avere un metodo generico che restituisce un altro tipo rispetto al tipo generico. Forse vuoi un metodo che aggiunge un elemento ad una collezione (quindi un oggetto di tipo T), e invece di restituire l'oggetto aggiunto (che sarebbe anche di tipo T), vuoi che restituisca l'indice di quell'elemento nel collezione, che sarebbe sempre un int.

metodo Esempio firma dove il tipo di ritorno non è il tipo generico: metodi

public static <T> Integer addAndReturn(T element, Collection<T> collection) 

generici, come qualsiasi altro metodo, può avere qualsiasi tipo di ritorno, compreso il tipo generico stessa, qualsiasi altro tipo di classe, qualsiasi tipo di dati di base o intrinseco o nulla. Potresti confondere 2 parti non correlate della firma del metodo, pensando che siano dipendenti, quando non lo sono. Sono solo "dipendenti" nel senso che se si usa come tipo di ritorno, il tipo del valore restituito è del tipo generico fornito nel sito di chiamata.

Problemi correlati