Ein Zweck eines generischen Konstruktors kann derselbe wie für einige generische Methoden sein: Um sicherzustellen, dass mehrere Argumente auf denselben Typ verweisen.
Betrachten Sie das folgende Beispiel (ja, es ist ein bisschen gekünstelt ist, sollte aber den Punkt zeigen):
import java.util.ArrayList;
import java.util.Collection;
public class GenericConstructorTest
{
public static void main(String[] args)
{
Collection<String> strings = new ArrayList<String>();
ClassWithParam c0 = new <String>ClassWithParam("String", strings);
}
}
class ClassWithParam
{
public <T> ClassWithParam(T data, Collection<T> collection)
{
collection.add(data);
}
}
Es spielt keine Rolle für die Klasse oder den Konstruktor die Typ genau dort verwendet wird. Es ist nur wichtig zu wissen, dass die Sammlung, die als zweites Argument angegeben wurde, Elemente des Typs annehmen kann, der als erstes Argument angegeben wurde.
(Ich möchte ein realistischeres, praktisches Beispiel zeigen, denke aber, dass es eher selten notwendig ist, einen Konstruktor auf diese Weise zu parametrisieren, und man könnte sogar meinen, dass dies nur ein "Nebeneffekt" der Möglichkeit ist parametrieren Methoden, und die Tatsache, dass es keinen Grund gibt explizit - diese für den Bau nicht zulassen ...)
EDIT Wie pro Antrag in den Kommentar, und Beispiel, wo die angegebenen Argumente sind atually verwendet. Es ist immer noch ziemlich erfunden. Realistischere Beispiele könnten strukturell ähnlich sein und, auf einige Arten von Zuhörer beziehen sich aber viel mehr Code würde bedeuten:
public class GenericConstructorTest
{
public static void main(String[] args)
{
Callback<String> callback = new Callback<String>();
ClassWithParam c0 = new <String>ClassWithParam("String", callback);
c0.execute();
}
}
class ClassWithParam
{
private Runnable runnable;
public <T> ClassWithParam(final T data, final Callback<T> callback)
{
runnable = new Runnable()
{
@Override
public void run()
{
callback.call(data);
}
};
}
void execute()
{
runnable.run();
}
}
class Callback<T>
{
void call(T t)
{
System.out.println("Called with "+t);
}
}
Das zweite Beispiel, das Sie
Integer val = new <String>Integer(100);
kompiliert nicht veröffentlicht in Eclipse mit Java 7.Es klagt
Der Konstruktor Integer (int) vom Typ Integer ist nicht generisch; es kann nicht mit Argumenten
In Java 8, ist dies erlaubt parametriert werden, obwohl es immer noch eine Warnung ausgibt:
Ungenutzte Typargumente für den nicht generischen Konstruktor Integer (int) vom Typ Integer; es sollte nicht mit Argumenten
parametriert werden (Wenn diese Differenz ist, was Sie in wirklich interessiert sind, sollten Sie überlegen, das als eine separate Frage zu stellen)
nur eine wilde Vermutung, aber ich denke, es kompiliert, weil der Typ ist falsch platziert. Der korrekte Weg wäre 'new Integer (100);' oder 'new MyClass (12);'. –
Tom
@Tom 'neue MyClass' würde verwendet werden, wenn * die Klasse selbst * einen Parameter hätte, wie 'class MyClass '. Aber in diesem Fall ist es der Konstruktor, der den Parameter besitzt, und das Schreiben auf diese Weise ist die Standardmethode zum Aufrufen generischer Methoden oder Konstruktoren. –
Marco13