tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von Bratkartoffel
ERLEDIGT
JA
ANTWORTEN
2
ZUGRIFFE
474
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von darkmagic2002
    darkmagic2002 darkmagic2002 ist offline Mitglied Bronze
    Registriert seit
    Jan 2009
    Beiträge
    33
    Hallo zusammen,
    meine generische Klasse MyClass
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    public class MyClass<T extends Number>
    {
          T toTypeT(String str)
          {
                 //wenn Typparameter T Integer ist
                 return Integer.parseInt(str);
                 
                 //wenn Typparameter T Float ist
                 return Float.parseFloat(str);
     
                 //evtl. usw.
          }
    }
    soll so spezialisiert sein, dass die Methode toTypeT(String) ein Objekt der Klasse des Typparameters T zurückgibt. Dabei reicht es nicht, wenn die Methode ein in nach Number gecastetes Objekt zurückgibt.
    Ich würde gerne wissen, wie man die Klasse von T zur Laufzeit erfragen kann. Wahrscheinlich liege ich mit Reflection richtig. Hat jemand dazu den Code, da ich mich mit Reflection noch nicht auseinandergesetzt habe.
    Dankeschön im Vorraus,
    kevin
     

  2. #2
    Avatar von Bratkartoffel
    Bratkartoffel Bratkartoffel ist offline gebratene Kartoffel
    tutorials.de Premium-User
    Registriert seit
    Jun 2007
    Ort
    Passau (Niederbayern)
    Beiträge
    1.394
    Hallo,

    mit folgendem Code kannst du dir zumindest schon mal den Typ / den Klassennamen von "T" holen:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    public class MyClass<T extends Number> {
        public T toTypeT(String str) {
            String typeOfT = "";
            
            for(TypeVariable<?> generics : this.getClass().getTypeParameters())
                for(Type typ : generics.getBounds())
                    if(generics.getName().equals("T"))
                        typeOfT = typ.toString().split(" ")[1];
            
            System.out.println(typeOfT);
            return null;
        }
        
        public static void main(String[] args) {
            new MyClass<Integer>().toTypeT("13");
        }
    }

    Hier liefert er natürlich (siehe Ausgabe) "java.lang.Number". Warum das? Nun, die Klasse weiß zur Laufzeit nur, dass eine Number las Typparameter angegeben wurde und nicht ob der angegebene Typ nur davon geerbt hat. Dies ist auch nicht weiter schlimm, denn du kannst ja auf den Typparameter eh nur durch casten oder so zugreifen, du hast ja keine Instanz des Typparameters.

    Um herauszufinden, welche Subklasse von Number übergeben wurde, musst du (meines Wissens nach) mit instanceof oder einen Vergleich der Klassen die einzelnen Fälle durchgehen. Zum Beispiel so:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    
     
    public class MyClass<T extends Number> {
        private Class<? extends Number> myType = null;
        
        public MyClass(Class<? extends Number> myType ) {
            this.myType = myType;
        }
     
        @SuppressWarnings("unchecked")
        public T toTypeT(String str) {
            if(myType == Integer.class) {
                return (T) new Integer(Integer.parseInt(str));
            }
            
            if(myType == Double.class) {
                return (T) new Double(Double.parseDouble(str));
            }
            
            if(myType == Float.class) {
                return (T) new Float(Float.parseFloat(str));
            }
            
            // usw...
            return null;
        }
        
        public static void main(String[] args) {
            MyClass<Integer> test = new MyClass<Integer>(Integer.class);
            Number n = test.toTypeT("13");
            
            System.out.println(n.getClass() + ": " + n.toString());
        }
    }

    Wo der Sinn des Ganzen liegt, weiß ich nicht Eventuell kann es jemand besser erklären

    Gruß
    BK
    Geändert von Bratkartoffel (13.09.10 um 15:18 Uhr)
    darkmagic2002 bedankt sich. 
    Über eine gute Bewertung freut sich jeder ;)
    Bitte erledigte Threads als "Erledigt" markieren.

    "Though a program be but three lines long, someday it will have to be maintained.''
    -- Geoffrey James, "The Tao of Programming"

  3. #3
    Avatar von darkmagic2002
    darkmagic2002 darkmagic2002 ist offline Mitglied Bronze
    Registriert seit
    Jan 2009
    Beiträge
    33
    Hallo Bratkartoffel,
    vielen Dank für die Antwort. Genau das habe ich gesucht! Vor allem dein zweites Beispiel hat mir sehr geholfen.
    Grüße kevin
     

Ähnliche Themen

  1. Mit einer Klasse Objekte für eine andere Klasse erstellen.
    Von New2Java im Forum Java Grundlagen
    Antworten: 14
    Letzter Beitrag: 21.11.10, 12:37
  2. Antworten: 7
    Letzter Beitrag: 24.05.10, 14:19
  3. Member-Variable einer MFC-Klasse in einfache Klasse einfügen
    Von cappa555 im Forum VisualStudio & MFC
    Antworten: 1
    Letzter Beitrag: 12.12.08, 17:33
  4. Antworten: 2
    Letzter Beitrag: 02.01.07, 16:27
  5. Antworten: 2
    Letzter Beitrag: 06.02.06, 19:57

Stichworte