2012-10-31 12 views
7

Utilizzo di Java: Non volevo sprecare tempo alla gente e postare questo qui, ma le mie competenze su google mi hanno deluso e non riesco a trovare la risposta. Stavo guardando attraverso un codice fornito e hanno usatoJava in riferimento a <E> vuoto statico <E> vuoto

public static <E> void printTree(TwoFourTree<E> tf) 

(Per riferimento stiamo convertendo da un albero Rosso-Nero a un-Four Two Tree). Quando mi sono avvicinato per la prima volta a questo problema, userei invece e non includere nemmeno nella dichiarazione iniziale del metodo di public static void. Tuttavia mi sono imbattuto in problemi, e l'introduzione di questo <E> ha risolto tutti i miei problemi, nonostante l'utilizzo di <Integer> invece di <E> ovunque.

Quindi la mia domanda è, qualcuno può spiegare a me che cosa esattamente il <E> fa in

public static <E> void 
+1

È un parametro di tipo generico. Vedere http://docs.oracle.com/javase/tutorial/java/generics/ –

risposta

3

Questa è una caratteristica nota come Java Generics.

Perché vorresti usare Generics? Bene, il seguente fornisce uno scenario in cui sono utili. Tornando ai "brutti giorni", se volevi avere una classe che potesse funzionare con qualsiasi oggetto, dovevi dichiarare tutte le sue interfacce in termini di oggetti, ad es.

public class MySuperList 
{ 
    public void Add(object a) { } 
} 

Tuttavia, questo fa schifo, perché si ottiene alcun tipo di sicurezza - si potrebbe scrivere il codice come il seguente:

// Your code 
MySuperList list = new MySuperList(); 
cars.Add(new Car("Ford Mondeo"));// Works 
cars.Add(new Fish("Herring")); // Works - which is a shame as a Fish is not a car! 

Generics corregge questo, consentendo di forza di tipo vostra classe, ma in un modo generico.Ad esempio:

public class MySuperList<T> 
{ 
    // Add method will only accept instances of type T. 
    public void Add(T a) { } 
} 

// Your code 
MySuperList<Cars> list = new MySuperList<Cars>(); 
cars.Add(new Car("Ford Mondeo"));// Works 
cars.Add(new Fish("Herring")); // Compile-time error. 
+1

Solo una cosa tecnica, ma i nomi dei metodi in genere iniziano con una lettera minuscola. – arshajii

+1

Scusa - Sono un programmatore C# di mestiere;) –

0

Si crea un metodo generico ; cioè ti permette di usare un TwoFourTree che trattiene qualsiasi tipo di oggetto come argomento (in questo caso).

Se, per esempio, voleva solo accettare TwoFourTree s che conteneva oggetti di tipo List, si dovrebbe definire il metodo come

public static <E extends List> void ... 

Se si voleva solo Number oggetti (Integer, Double ecc) si dovrebbe fare

public static <E extends Number> void ... 

Questo è un motivo per cui la creazione di tali metodi può essere utile. Tengo a precisare che il divertimento non finisce qui, si può fare lo stesso utilizzando più parametri di tipo, per esempio:

public static <T, S extends Number> void ... 

Penso che si potrebbe trovare vantaggioso per leggere this tutorial su metodi generici se si' Mi piacerebbe saperne di più.

0

Invece di scrivere

public static Integer ... 
public static Double ... 
public static Long ... 

...

tutto ciò che fai è creare farmaci generici metodo

public static <E> 
+2

Non è possibile scrivere 'metodo void' Integer può portare con numero intero o Vuoto. Si prega di modificare o eliminare la risposta. –

+0

Che stupido errore da principiante :) grazie per averlo notato. – elrado

Problemi correlati