Generic

saladin100

Mitglied
Servus Leute,

Ich zieh mich grad bisschen Generics rein... und ein Beispiel aus einer Literatur verwirrt mich total.

Java:
public class Test {

public <T> T zufall(T m, T n) {
	return Math.random() > 0.5 ? m : n;
}

public static void main(String[] args) {
	Test t = new Test();
	System.out.println(t.zufall("hallo", 65));
	}
}

Also der Code last sich kompilieren.... aber sollte der Compiler nicht heulen? etwa an der Stelle
Java:
t.zufall("hallo", 65)
Der Compiler sollte doch was sagen wie: Hier kannst du nur zwei Objekte vom selben Typ reinstecken... aber irgendwie geht des auch Oo?!

mfg saladin
 
Zuletzt bearbeitet:
G

Gast2

Gast
Nein, du sagst dem Compiler ja nicht explizit was T sein soll.
Java:
System.out.println(t.<String>zufall("hallo", 65));
Hier würde der Compiler dann tatsächlich meckern, weil er zwei Parameter vom Typ String erwartet.

PS:
Und es heißt weder "Generice" noch "Generis", sondern generic ;)
 
N

nillehammer

Gast
Hätte jetzt auch gedacht, dass das einen Kompilierfehler gibt. Aber wahrscheinlich behandelt bei dem Konstrukt der Compiler einfach beide Parameter als vom Typ Object. Dann sind die Typen ja gleich. String ist sowieso schon ein Object und die 65 wird wohl zu einem Integer autogeboxed.

P.S. Wär doch ne schöne Frage für die Java-Quizecke :)
 

xehpuk

Top Contributor
Der Compiler sucht für den Rückgabetyp dann einen gemeinsamen Nenner.

Krachen wird es dann bei solchen Aufrufen:
Java:
// Type mismatch: cannot convert from Object&Serializable&Comparable<?> to ...
String s = t.zufall("hallo", 65);
int i = t.zufall("hallo", 65);

An der Fehlermeldung siehst du dann aber, was wiederum gehen würde:
Java:
Object o = t.zufall("hallo", 65);
Serializable s = t.zufall("hallo", 65);
Comparable<?> c = t.zufall("hallo", 65);

PS: Die Methode sollte eher
Code:
Math.random() < 0.5 ? m : n
bzw.
Code:
Math.random() >= 0.5 ? m : n
zurückgeben. ;)
 

saladin100

Mitglied
Halli hallo,

ich hab zu dem Thema nochmal ne Frage^^..

Also.. folgender Code.

Java:
public class Test {
	
	public <T> void zufall(T m, ArrayList<T> list) {	
	}
	
	public static void main(String[] args) {
		Test t = new Test();
		String s = "hallo";
		ArrayList<String> listOfStrings = new ArrayList<String>();
		t.zufall(s, listOfStrings);
                t.zufall(65,listOfStrings); //Geht nicht
	}
}


in diesem Fall is es jetzt völlig wurst, ob ich <String>zufall() oder zufall() schreibe. Der Compiler schreibt mit in beiden Fällen vor, für "s" einen String einzusetzen.
Liegt das jetzt daran, das die Methode zufall() einen Parameter mit einem generischen Typ erwartet
(in diesem Fall eben ArrayList) und dadurch dann gleich weis, was T für ein Typ ist?

lg saladin
 

Marco13

Top Contributor
Hmja, eine ArrayList<String> und eine ArrayList<Object> haben eben nichts miteinander zu tun (letzteres würde wohl gehen). Man kann da mit extends/super noch ein bißchen dran feilen, aber ggf. solltest du genauer sagen, was du erreichen willst.
 

Illuvatar

Top Contributor
Hmja, eine ArrayList<String> und eine ArrayList<Object> haben eben nichts miteinander zu tun (letzteres würde wohl gehen). Man kann da mit extends/super noch ein bißchen dran feilen

Um etwas spezifischer zu sein, z.B. so:
Java:
public class Test {
    public <T> T zufall(T m, ArrayList<? extends T> list) {
           return null;
    }

    public static void main(String[] args) {
        Test t = new Test();
        String s = "hallo";
        ArrayList<String> listOfStrings = new ArrayList<String>();
        
        String str = t.zufall(s, listOfStrings); // Geht
        Comparable<? extends Serializable> cmp = t.zufall(65,listOfStrings); // Geht
        String str2 = t.zufall(65, listOfStrings); // Geht nicht
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
wolei Java generic interface in a generic class Java Basics - Anfänger-Themen 6
L Datentypen Deklarierte Felder einer Generic Klasse bestimmen Java Basics - Anfänger-Themen 7
O Comparable Generic Java Basics - Anfänger-Themen 24
F Type safety: A generic array of.. Fehler Java Basics - Anfänger-Themen 3
Yjuq Generic Methode - Wie muss die List Definition aussehen? Java Basics - Anfänger-Themen 3
S Gibt es für die Klasse HashMap Generic Implementierungen? Java Basics - Anfänger-Themen 11
C Generic im Konstruktor Java Basics - Anfänger-Themen 1
O Generic - Verstädnisproblem Java Basics - Anfänger-Themen 5
G instanceof in Generic Java Basics - Anfänger-Themen 7
N Datentypen LocalDate Generic Comparable Java Basics - Anfänger-Themen 2
P Variablen generic type variablen in object array Java Basics - Anfänger-Themen 1
M Generic Prüfungsvorbereitung Java Basics - Anfänger-Themen 4
G Generic und Listen Java Basics - Anfänger-Themen 8
J Generic - Autoboxing Java Basics - Anfänger-Themen 18
N Generic clonen => eclipse empfiehlt @SuppressWarnings("unchecked") Java Basics - Anfänger-Themen 2
P Java Generic Wildcard Java Basics - Anfänger-Themen 2
G Namen der Generic Klasse Java Basics - Anfänger-Themen 3
D generic extendet class Java Basics - Anfänger-Themen 10
M Generic's und Vererbung Java Basics - Anfänger-Themen 6
B Generic? Enum - So lösbar? Java Basics - Anfänger-Themen 8
capgeti Datentypen Static generic return value von Subclass? Java Basics - Anfänger-Themen 9
C Generic Tutorial Java Basics - Anfänger-Themen 12
T Generic vom Generic: Zu sehr verschachtelt? Java Basics - Anfänger-Themen 6
V libssrckdtree-j Generic k-d tree Java library - weiss nicht wo des hin soll Java Basics - Anfänger-Themen 2
L Sinn hinter Generic? Java Basics - Anfänger-Themen 5
0 Was bedeutet dieser Generic-code? Java Basics - Anfänger-Themen 3
A Generic Problem Java Basics - Anfänger-Themen 16
S Generic Methode: syntax klemmt Java Basics - Anfänger-Themen 10
S Generic: Verständnisfrage Java Basics - Anfänger-Themen 2
S generic programmierung "ne:w T[X]" Java Basics - Anfänger-Themen 2
G generic interface problem Java Basics - Anfänger-Themen 12
Safado generic array creation Java Basics - Anfänger-Themen 2
G Frage zur Generic java ? Java Basics - Anfänger-Themen 9
G eine Frage zur Generic Java ? Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben