Generic Typ abfragen

bemar

Mitglied
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:
MyClass<Number> myClass = new MyClass<Number>(1);

PHP:
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();
      }
   }
}
 
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 :D. 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
 
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?
 
Java:
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!
 
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.
 
Hallo,

wie Olli schon sagte ist das in 99% der Fälle nicht notwendig kann aber bei generischem Frameworkcode auch mal nützlich sein.
Java:
/**
 * 
 */
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/310803-java-generics-generischen-typ-ermitteln.html

Gruß Tom
 
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!
 
Zurück