2012-10-31 2 views
7

Mit Java: Ich wollte nicht verschwenden Zeit und posten dies hier, aber meine googling-Fähigkeiten haben mich gescheitert und ich kann die Antwort nicht finden. Ich war durch einige gelieferten Codes suchen und sie verwendeteJava in Bezug auf <E> in öffentlichen statischen void

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

(als Referenz wir von einem Rot-Schwarz-Baum auf einen Zwei-Vier-Baum konvertieren). Als ich zuerst dieses Problem ansprach, würde ich statt dessen verwenden und nicht einmal in die ursprüngliche Methodendeklaration von public static void aufnehmen. Jedoch stieß ich auf Probleme, und warf in diesem <E> löste alle meine Probleme, trotz der Verwendung <Integer> anstelle von <E> überall sonst.

Also meine Frage ist, kann jemand mir bitte erklären, was genau die <E> tut in

public static <E> void 
+1

Es ist ein generischer Typparameter. Siehe http://docs.oracle.com/javase/tutorial/java/generics/ –

Antwort

3

Dies ist eine Java-Funktion als Generics bekannt.

Warum möchten Sie Generika verwenden? Nun, das folgende gibt ein Szenario, in dem sie nützlich sind. Zurück in den "schlechten alten Tagen", wenn Sie eine Klasse haben wollten, die mit irgendwelchen Objekten arbeiten konnte, mussten Sie alle ihre Schnittstellen in Bezug auf Objekte deklarieren, z.

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

jedoch dieses saugt, weil Sie keine Typsicherheit zu bekommen - Sie Code wie folgt schreiben könnte:

// 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 korrigiert diese Fehler, indem Sie Ihre Klasse stark ein, aber in einer generischen Art und Weise.Zum Beispiel:

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

Nur eine technische Sache, aber Methodennamen beginnen in der Regel mit einem Kleinbuchstaben. – arshajii

+1

Sorry - Ich bin ein C# Programmierer von Beruf;) –

0

Es schafft eine generische Methode; Das heißt, Sie können einen TwoFourTree verwenden, der in diesem Fall einen beliebigen Objekttyp als Argument enthält.

Wenn Sie zum Beispiel nur wollte TwoFourTree s akzeptieren, die Objekte vom Typ gehalten List, würden Sie die Methode als

public static <E extends List> void ... 

definieren Wenn Sie nur Number Objekte (Integer, Double etc.) gesucht würde tun

public static <E extends Number> void ... 

Dies ist ein Grund, warum die Erstellung solcher Methoden in der Tat nützlich sein kann. Ich möchte darauf hinweisen, dass der Spaß nicht dort endet, können Sie das gleiche tun mehrere Typparameter verwenden, zum Beispiel:

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

Ich denke, man könnte es von Vorteil this Tutorial über generische Methoden zu lesen, wenn Sie‘ Ich möchte mehr erfahren.

0

Statt zu schreiben

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

...

alles, was Sie tun, ist Generika create-Methode

public static <E> 
+2

Sie können nicht schreiben "Integer void" -Methode kann mit Integer oder Void resultieren. Bitte bearbeiten oder löschen Sie Ihre Antwort. –

+0

Was für ein blöder Anfängerfehler :) Danke, dass du es bemerkt hast. – elrado

Verwandte Themen