tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
7
ZUGRIFFE
2097
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    bemar bemar ist offline Mitglied Bronze
    Registriert seit
    Oct 2007
    Beiträge
    26
    Hallo miteinander,

    hab da mal ein Problem. Ich habe eine Klasse, die Abhängig vom Typ des Generics einen Datentyp zurückliefert (wer häts gedacht). Ich hab jedoch das Problem, das die Generierung des Datentyps (aus einem XML File) abhängig vom Generic ist. Um aber ein Generic z.B. auf "instanceof" Abfragen zu können, muss die generic Variable mit einer Instanz des übergebenen Generics gesetzt sein. Wie kann ich das umgehen?
    Kurz also, kann ich eine uninstanzierte Variable auf Typ abfragen?

    So siehts momentan aus:
    PHP-Code:
    MyClass<NumbermyClass = new MyClass<Number>(1); 
    PHP-Code:
    public class MyClass<T>{
       private 
    T type;
       
       public 
    MyClass(T type){
          
    this.type type;
       }

       public 
    T doingSomeMagic(){
          if (
    this.type instanceof Number){
             return 
    wurschtelNumber();
          }else if(
    this.type instanceof String){
             return 
    wurschtelString();
          }
       }

     

  2. #2
    Avatar von Oliver Gierke
    Oliver Gierke Oliver Gierke ist offline Mitglied Rubin
    Registriert seit
    Dec 2003
    Ort
    Mannheim
    Beiträge
    1.457
    Kurz, es geht nicht. (Lang: es geht unter gewissen Umständen doch, die sind allerdings sehr exotisch und in deinem Fall nicht praktikabel). falls du wissen willst warum, google mal nach Generics und Type Erasure.

    Was du da vorhast sieht übrigens auf den ersten Blick nach schlechtem Design aus . instanceof ist für diese Fälle foo. warum lässt du nicht einfach den Konstruktor ohe parameer und bietest die Methode someMagic mit mehreren Parametertypen an?

    Gruß
    Ollie
     
    In theory, there is no difference between theory and practice. In practice, there is!

    www.olivergierke.de

  3. #3
    bemar bemar ist offline Mitglied Bronze
    Registriert seit
    Oct 2007
    Beiträge
    26
    Hi,

    danke für deine Antwort. Das es nicht das nonplusultra ist ist mir klar. Drum poste ich hier ja Ähnliche Probleme hatte ich schon öfters und ich dachte mit Generics kann ichs lösen.
    Das funktioniert aber imho nur, wenn ich eine Instanz des generischen Typs an die Klasse/Funktion übergebe, was ich aber nicht will, da es eigentlich nichts zu übergeben gibt.

    Das mit den Parametern in doingSomeMagic versteh ich nicht.
    Was ist der Unterschied ob ich den Typ im Kontruktor übergebe oder in der Funktion?
     

  4. #4
    Avatar von Oliver Gierke
    Oliver Gierke Oliver Gierke ist offline Mitglied Rubin
    Registriert seit
    Dec 2003
    Ort
    Mannheim
    Beiträge
    1.457
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    public class MyClass {
     
      public Number doingSomeMagic(Number foo) {
     
      }
     
      public String doingSomeMagic(String foo} {
     
      }
    }
    Damit wählt der Client über den Parameter die passende Methode. Einfaches Überladen. Dafür braucht man keine Generics auspacken .

    REINHAUN!
     
    In theory, there is no difference between theory and practice. In practice, there is!

    www.olivergierke.de

  5. #5
    bemar bemar ist offline Mitglied Bronze
    Registriert seit
    Oct 2007
    Beiträge
    26
    Danke, aber die Lösung is mir zu billig
     

  6. #6
    Avatar von procurve
    procurve procurve ist offline Mitglied Gold
    Registriert seit
    Aug 2007
    Beiträge
    158
    Billig oder nicht, das ist jedenfalls der richtige Weg.

    Generics braucht man eigentlich nur in seltenen Fällen, meistens kann man wesentlich elegantere und/oder einfachere Konstrukte verwenden.
     

  7. #7
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.885
    Blog-Einträge
    29
    Hallo,

    wie Olli schon sagte ist das in 99% der Fälle nicht notwendig kann aber bei generischem Frameworkcode auch mal nützlich sein.
    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
    
    /**
     * 
     */
    package de.tutorials;
     
    import java.lang.reflect.ParameterizedType;
     
    /**
     * @author Thomas.Darimont
     *
     */
    public class RuntimeGenericsDetection {
     
        /**
         * @param args
         */
        public static void main(String[] args) {
            System.out.println(new TypeHolder<String>(){}.getType());
        }
        
        static class TypeHolder<TType>{
            Class<TType> type;
     
            @SuppressWarnings("unchecked")
            public TypeHolder(){
                type = (Class<TType>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
            }
            
            public Class<TType> getType() {
                return type;
            }
        }
    }

    Ansonsten schau mal hier:
    http://www.tutorials.de/forum/java/3...ermitteln.html

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  8. #8
    Avatar von Oliver Gierke
    Oliver Gierke Oliver Gierke ist offline Mitglied Rubin
    Registriert seit
    Dec 2003
    Ort
    Mannheim
    Beiträge
    1.457
    Das ist, was ich mit der langen Version in meinem Ursprungspost meinte. Allerdings weiß ich nicht, wie sinnvoll es ist a) ein derart triviales Problem mit einem derart komplizierten Vorgehen zu erschlagen und b) dies einem Anfänger vorzuschlagen. Sowas führt im allgemeinen nur dazu, dass solche Vorschläge per Copy & Paste übernommen werden und kein Gedanhke bzgl. der Sinnhaftigkeit verschwendet wird.

    Es muss immer so einfach wie möglich gehen, aber kein bisschen einfacher .

    REINHAUN!
     
    In theory, there is no difference between theory and practice. In practice, there is!

    www.olivergierke.de

Ähnliche Themen

  1. Generic SAX Parser Problem
    Von Markus Taubek im Forum XML Technologien
    Antworten: 0
    Letzter Beitrag: 18.11.10, 14:35
  2. Testfrage bzgl. generic methods / Typparameter
    Von Steve222 im Forum Java Grundlagen
    Antworten: 4
    Letzter Beitrag: 08.09.10, 22:33
  3. TROJ Generic.ADV - Was tun?
    Von aquila im Forum Security (Viren, Trojaner, Spam)
    Antworten: 3
    Letzter Beitrag: 07.09.08, 18:14
  4. [VC++.NET] Arbeiten mit Generic::List / Array
    Von the incredible Leitman im Forum .NET Datenverwaltung
    Antworten: 19
    Letzter Beitrag: 27.12.06, 10:13
  5. Antworten: 0
    Letzter Beitrag: 29.03.06, 01:19