public static <T> T foo(T x, T x2) {
return (T) (x + " " + x2);
}
public static void main(String args[]) {
System.out.println(foo(33, "232"));
}
Ich weiß, T wird von dem Typ sein, der im Parameter übergeben wird. Aber hier gibt es zwei Arten. Welcher von ihnen ist T?Warum kompiliert dieser generische Code in Java?
und warum zwingt mich der Compiler nicht, die Parameter des gleichen Typs zu haben, wenn ich foo rufe?
Es ist zulässig, weil 'T'' Objekt' sein kann, so dass Sie die Methode zwei beliebige Objekte übergeben können. ('32' kann in diesem Fall ein' Integer' sein und nicht ein 'int'). – khelwood
Und die obere Grenze von' T' ist 'Objekt', also ist im' kompilierten Code' die Besetzung '(T)' ' (Object) ', was gilt, weil' String' ein 'Objekt' ist. –
Auch um die Kommentare hinzuzufügen, das ist der Grund, warum Sie nie ungebundene Typen verwenden möchten (die Generika werden weggelassen), da prinzipiell jede Kombination von Klassen gültig ist. Wenn Sie dies tun, befinden Sie sich möglicherweise in einer Situation, in der 'ClassCastExceptions' das übliche Ergebnis der Arbeit mit den Rohtypen – SomeJavaGuy