6 Stimmen

Java : Was ist - public static<T> foo() {...}?

Ich habe eine Java-Funktion gesehen, die in etwa so aussah.

public static<T> foo() {...}

Ich weiß, was Generika sind, aber kann mir das jemand in diesem Zusammenhang erklären? Wer entscheidet, was T gleich ist? Was geht hier vor?

EDIT: Kann mir bitte jemand ein Beispiel für eine solche Funktion zeigen?

12voto

Tom Hawtin - tackline Punkte 142461

Sie haben den Rückgabetyp ausgelassen, aber abgesehen davon ist es eine generische Methode. Wie bei generischen Typen, T steht für einen beliebigen Referenztyp (innerhalb der Grenzen, falls gegeben).

Bei Methoden werden generische Parameter normalerweise vom Compiler abgeleitet. In bestimmten Situationen kann es sinnvoll sein, die generischen Argumente selbst anzugeben, wobei eine etwas eigenartige Syntax verwendet wird:

    List<String> strings = Collections.<String>emptyList();

In diesem Fall hätte der Compiler den Typ ableiten können, aber es ist nicht immer offensichtlich, ob der Compiler das kann oder nicht. Beachten Sie, dass der <> steht nach dem Punkt. Aus syntaktischen Gründen muss immer der Typname oder das Zielobjekt angegeben werden.

Es ist möglich, generische Konstruktoren zu haben, aber ich habe noch nie einen in freier Wildbahn gesehen und die Syntax wird immer schlechter.

Ich glaube, dass die Syntax von C++ und C# die generischen Typen nach dem Namen der Methode/Funktion platziert.

3voto

Kathy Van Stone Punkte 24475

Der Kontext ist eine generische Methode im Gegensatz zu einer Klasse. Die Variable <T> gilt nur für den Aufruf der Methode.. Die Klasse Collections verfügt über eine Reihe dieser Methoden; die Klasse selbst ist nicht generisch, aber viele der Methoden sind es.

Der Compiler entscheidet, was T gleich ist - es ist gleich, was die Typen zum Funktionieren bringt. Manchmal ist das einfacher, manchmal nicht.

Zum Beispiel, die Methode static <T> Set<T> Collections.singleton(T o) der Typ ist im Parameter definiert:

Collections.singleton(String T)

gibt eine Set<String> .

Manchmal ist der Typ schwer zu definieren. Zum Beispiel gibt es manchmal nicht leicht genug Informationen, um zu schreiben Collection.emptyList() . In diesem Fall können Sie den Typ direkt angeben: Collection.<String>emptyList() .

1voto

Eliseo Ocampos Punkte 2382

T ist der formale Typ-Parameter, der durch den tatsächlichen Typ ersetzt wird Argument ersetzt, das bei der Instanziierung des Objekts verwendet wird.

Zum Beispiel, hier ist die Liste und Iterator Definitios im Paket java.util:

public interface List<E>{
  void add(E x);
  Iterator<E> iterator();
}

public interface Iterator<E>{
  E next();
  boolean hasNext();
}

Dann können Sie eine Liste auf diese Weise instanziieren:

List<String> ls = new ArrayList<String>()

Wobei man sich vorstellen könnte, dass List für eine Version von List steht, bei der E einheitlich durch String ersetzt wurde:

public interface StringList{
  void add(String x)
  Iterator<String> iterator();
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X