2016-04-04 9 views
-3

Ich habe einige Probleme mit generischen Typen. Ich verstehe nicht, warum in diesem Code alle Anrufe an myTest Punkt an:Generika-Typ. Alle Anrufe gehen zu der gleichen Methode und ich weiß nicht warum

public static <MyData> void myTest(Integer integer) 

In einigen Fällen wir die Art zwischen spitzen Klammern angeben:

tr.<Number>myTest(null); OR tr.<String>myTest(null); 

Aber ich erwarte, dass Anrufe gehen andere Methoden.

das ist meine Klasse:

public class MyTest { 

    public static void main(String[] arg){ 
     MyTest tr = new MyTest(); 

     tr.<Number>myTest(null); 

     tr.<MyTest>myTest(null); 

     tr.<String>myTest(null); 

    } 

    public static <Number> void myTest(Number number){ 
    } 
    public static <MyData> void myTest(Integer integer){ 
    } 
    public static   void myTest(String string){ 
    } 
    public static <String> void testClass(String string){ 
    } 
} 

Vielen Dank im Voraus!

+0

Hmm. Wenn es ambivalent ist, sollte der Code nicht einmal kompilieren. – Thilo

+2

'' erstellt eine Typvariable namens 'Number'. Es bezieht sich nicht mehr auf 'java.lang.Number'. Entfernen Sie einfach die ''. (Ähnlich für andere Methoden). –

Antwort

2
public static <Number> void myTest(Number number){ 
} 

Hier <Number> erstellt eine Variable vom Typ Number genannt - Sie sind keine Hinweise mehr auf java.lang.Number. Dieser Code ist semantisch äquivalent zu schreiben:

public static <T> void myTest(T number){ 
} 

so grundsätzlich wie das Schreiben das gleiche, es ist

public static void myTest(Object number){ 
} 

(vorausgesetzt, Sie sind nie zu Number/T im Körper des Verfahrens verweisen müssen).

Als solche alle drei der Aufrufe von Prozeduren

tr.<Number>myTest(null); 
tr.<MyTest>myTest(null); 
tr.<String>myTest(null); 

einfach sind, die gleiche Methode mit verschiedenen generic Constraints aufruft.

Wenn Sie für jeden Typ eine andere Methode wünschen, verwenden Sie keine Generika. definieren, nur eine nicht-generische Überlast für jeden des Typs:

void myTest(Number n) { ... } 
void myTest(MyTest n) { ... } 
void myTest(String n) { ... } 

und dann mit einer expliziten Umwandlung der null (oder einer Referenz des bestimmten Typs) aufzuzurufen:

myTest((Number) null); 
myTest((MyTest) null); 
myTest((String) null); 
+0

Dann was ist die Verwendung für ? Wenn ich "Number" setze, möchte ich "Object" sagen, wenn ich Integer schreibe, möchte ich "Object" sagen, etc ... Ich lese Java-Dokumentation und ich verstehe, dass Sie zu jeder Methode ohne aufrufen können. Ich denke, das ist nicht richtig, aber alle sagt mir, dass ist nutzlos ... :(Ich muss dies löschen. Danke. – Marquake

+0

Sie verwenden Typ Variablen, wenn Sie den Typ beschränken müssen. Zum Beispiel ist ein Anwendungsfall, wo Sie brauchen zwei (oder mehr) Variablen vom selben Typ: ' void myTest (T paramA, T paramB) {}'. Ein anderer ist, wo Sie den Rückgabetyp benötigen, um einen Param zu finden: ' T myTest (T param) { return param;} '. Ein anderes ist, wo Sie eine Grenze für den Typ setzen müssen:' void myTest (T someNumber) '. Ein anderes ist, wo Sie tatsächlich beziehen müssen, um in den Körper eingeben. –

+0

Ok. Hier ich Unterschied für die Parameter: \t 'tr.myTest (neue Zeichenfolge (" A "), neue Zeichenfolge (" B ")); \t tr.myTest (neuer String ("A"), neuer Integer ("1")); \t tr.myTest (neuer String ("A"), null); \t tr.myTest (neue Ganzzahl ("1"), neue Ganzzahl ("1")); \t Hohlraum myTest (T parama, T paramB) { } \t Hohlraum myTest (String parama, T paramB) { \t} \t Hohlraum myTest (String parama, String paramB) { \t} \t nichtig myTest (Integer parama, T paramB) { \t} \t Leere myTest (Integer parama, Integer paramB) { \t} ' Dann oft schreiben' nicht sehr tr . '. Recht? Verwenden Sie häufiger die Typen des Parameters, um die aufgerufene Methode zu unterscheiden, oder? – Marquake

0

Try zu definieren eine neue Variable und rufe dann deine Methode damit auf. Beispiel:

public static void main(String[] arg) { 
    MyTest tr = new MyTest(); 

    Number number = null; 
    tr.<Number>myTest(number); 

    MyTest mTest = null; 
    tr.<MyTest>myTest(mTest); 

    String str = null; 
    tr.<String>myTest(str); 
} 
+0

Ich verstehe nur die Verwendung für "tr. "oder" tr. "oder" tr. ", ich habe kein Beispiel, in dem die Verwendung von" tr. <> "Sinnvoll ist ... – Marquake