Was bedeutet <T> (spitze Klammern) in Java?

139

Ich studiere derzeit Java und bin kürzlich von spitzen Klammern (<>) überrascht worden. Was genau meinen sie?

public class Pool<T>{
    public interface PoolFactory<T>{
        public T createObject();
    }
    this.freeObjects = new ArrayList<T>(maxsize)
}

Was bedeutet das <T>? Bedeutet das, dass ich ein Objekt vom Typ erstellen kann T?

Lachend
quelle
4
Es fällt mir schwer, Ihren Code zu analysieren. Zunächst einmal gibt es keine Einrückung, und es gibt zwei offene und nur eine geschlossene Klammer. Soll T createObjectsich in Pool oder PoolFactory befinden? Wo this.freeObjects = ...soll sein? Ist das ein separates Beispiel? Es ist illegal, es dort zu haben; es muss innerhalb einer Methode sein.
mgiuca
Wenn jemand nach Informationen über <>(Diamantoperator) sucht, die beispielsweise verwendet werden können, List<Integer> list = new ArrayList<>();besuchen Sie docs.oracle.com/javase/7/docs/technotes/guides/language/… .
Pshemo

Antworten:

161

<T>ist ein Generikum und kann normalerweise als "vom Typ T" gelesen werden. Es hängt vom Typ links vom <> ab, was es tatsächlich bedeutet.

Ich weiß nicht, was ein Pooloder PoolFactoryist, aber Sie erwähnen auch ArrayList<T>, dass es sich um eine Standard-Java-Klasse handelt, also werde ich damit sprechen.

Normalerweise sehen Sie dort kein "T", sondern einen anderen Typ. Also wenn du siehstArrayList<Integer> zum Beispiel sehen, bedeutet das "An ArrayListvon Integers". Viele Klassen verwenden Generika, um beispielsweise den Typ der Elemente in einem Container einzuschränken. Ein anderes Beispiel ist HashMap<String, Integer>"eine Karte mit StringSchlüsseln und IntegerWerten".

Ihr Pool Beispiel ist ein bisschen anders, weil es Sie definieren eine Klasse. In diesem Fall erstellen Sie also eine Klasse, die jemand anderes anstelle von T mit einem bestimmten Typ instanziieren könnte. Beispielsweise könnte ich Pool<String>mithilfe Ihrer Klassendefinition ein Objekt vom Typ erstellen . Das würde zwei Dinge bedeuten:

  • Meine Pool<String> hätte eine Schnittstelle PoolFactory<String>mit einer createObjectMethode, die Strings zurückgibt .
  • Intern Pool<String>würde das eine ArrayListvon Strings enthalten.

Das sind großartige Neuigkeiten, denn zu einem anderen Zeitpunkt könnte ich mitkommen und einen erstellen Pool<Integer>, der denselben Code verwendet, aber Integerüberall dort hat, wo Sie ihn Tin der Quelle sehen.

mgiuca
quelle
3
Eine der besten Erklärungen, die ich bisher gesehen habe :) Sehr geschätzt!.
Suhas Chikkanna
34

Es ist wirklich einfach. Es ist eine neue Funktion, die in J2SE 5 eingeführt wurde . Wenn Sie nach dem Klassennamen eckige Klammern angeben, erstellen Sie einen temporären Datentyp, der jeden Datentyp enthalten kann.

Beispiel:

class A<T>{
    T obj;
    void add(T obj){
        this.obj=obj;
    }
    T get(){
        return obj;
    }
}
public class generics {
    static<E> void print(E[] elements){
        for(E element:elements){
            System.out.println(element);
        }
    }

    public static void main(String[] args) {
        A<String> obj=new A<String>();
        A<Integer> obj1=new A<Integer>();
        obj.add("hello");
        obj1.add(6);
        System.out.println(obj.get());
        System.out.println(obj1.get());

        Integer[] arr={1,3,5,7};
        print(arr);
    }
}

Stattdessen <T>können Sie tatsächlich alles schreiben und es funktioniert genauso. Versuchen Sie, <ABC>anstelle von zu schreiben <T>.

Dies dient nur der Bequemlichkeit:

  • <T> wird als beliebiger Typ bezeichnet
  • <E> als Elementtyp
  • <N> als Nummerntyp
  • <V> als Wert
  • <K> als Schlüssel

Aber Sie können es so nennen, wie Sie wollen, es spielt keine Rolle.

Darüber hinaus Integer, String, Booleanetc sind Wrapper - Klassen von Java , der Hilfe bei den Typen während der Kompilierung zu überprüfen. Der obige Code objist beispielsweise vom Typ String, sodass Sie keinen anderen Typ hinzufügen können (versuchen Sie obj.add(1), es wird ein Fehler ausgegeben). Ebenso obj1ist vom IntegerTyp, Sie können keinen anderen Typ hinzufügen (versuchen Sie obj1.add("hello"), Fehler wird da sein).

Ruturaj Mohanty
quelle
23

Es ist verwandt mit Generika in Java. Wenn ich das erwähnt habe ArrayList<String>, bedeutet dies, dass ich dieser ArrayList nur Objekte vom Typ String hinzufügen kann.

Die zwei Hauptvorteile von Generika in Java sind:

  1. Reduzieren Sie die Anzahl der Casts in Ihrem Programm und damit die Anzahl der potenziellen Fehler in Ihrem Programm.
  2. Verbesserung der Codeklarheit
Paul Bellora
quelle
11

wird als generischer Typ bezeichnet. Sie können einen Objektpool wie folgt instanziieren:

PoolFactory<Integer> pool = new Pool<Integer>();

Der generische Parameter kann nur ein Referenztyp sein. Sie können also keine primitiven Typen wie int oder double oder char oder andere primitive Typen verwenden.

Rafiek
quelle
9

<>wird verwendet, um Generika in Java anzuzeigen .

Tist in diesem Beispiel ein Typparameter. Und nein: Instanziieren ist eines der wenigen Dinge, mit denen Sie nichts anfangen könnenT .

Abgesehen von dem oben verlinkten Tutorial ist Angelika Langers Generics FAQ eine großartige Ressource zu diesem Thema.

Joachim Sauer
quelle
8

Generische Klassen sind Klassentypen, die beim Erstellen einen Datentyp als Parameter verwenden. Dieser Typparameter wird in spitzen Klammern angegeben und der Typ kann sich jedes Mal ändern, wenn eine neue Instanz der Klasse instanziiert wird. Erstellen wir beispielsweise eine ArrayList für Mitarbeiterobjekte und eine andere für Unternehmensobjekte

ArrayList<Employee> employees = new ArrayList<Employee>();
ArrayList<Company> companies = new ArrayList<Company>();

Sie werden feststellen, dass wir dieselbe ArrayList-Klasse verwenden, um beide Listen zu erstellen, und den Typ "Mitarbeiter" oder "Unternehmen" in spitzen Klammern übergeben. Wenn eine generische Klasse mehrere Datentypen verarbeiten kann, müssen viele Klassen, die ähnliche Aufgaben ausführen, reduziert werden. Generika helfen auch dabei, Fehler zu reduzieren, indem sie allen einen starken Typ geben, der dem Compiler hilft, auf Fehler hinzuweisen. Wenn Sie einen Typ für ArrayList angeben, gibt der Compiler einen Fehler aus, wenn Sie versuchen, einen Mitarbeiter zur Unternehmensliste hinzuzufügen oder umgekehrt.

Adiii
quelle