tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
4
ZUGRIFFE
1021
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    maho15 maho15 ist offline Mitglied Gold
    Registriert seit
    Jul 2002
    Beiträge
    165
    Hallo,

    ich hoffe die untere Beschreibung ist verständlich.
    Gibt ein eine Möglichkeit abzufragen wie der generische Typ einer geerbten Klasse ist?

    Danke im Vorraus!


    Genersiche Oberklasse:
    PHP-Code:
    public abstract class Generisch<T> {
        private 
    ArrayList<T> list = new ArrayList<T>();
        
        public 
    void addValue(T value)
        {
            
    this.list.add(value);
        }
      } 
    Klasse die von Generisch erbt
    PHP-Code:
    public class UnterGenerisch extends Generisch<Integer> {

    Was ich gerne machen möchte:
    PHP-Code:
    public static void main(String[] args) {
               
    UnterGenerisch test = new UnterGenerisch();
           
    test.getClass().istDasDerGenerischeTyp(Integer) //gibt true zurueck 
     

  2. #2
    Anime-Otaku Anime-Otaku ist offline Mitglied Brillant
    Registriert seit
    Aug 2005
    Ort
    Karlsruhe (Baden-Württemberg)
    Beiträge
    905
    value.getClass();

    Dadurch bekommst du der Datentyp der die Variable zur Laufzeit hat. Dann kann man mit der Methode isInstanceOf(Class) von Class erkennen, ob diese Klasse zur Laufzeit eine Instanz davon ist. Ein normales instanceOf hilft da nichts.


    Was für Informationen brauchst du den genau? Um dein Problem vielleicht besser zu verstehen.
    Geändert von Anime-Otaku (02.10.09 um 12:34 Uhr)
     
    Wäre super wenn ihr euren Code in dieser Form einfügt:
    Code java:
    1
    
    System.out.println("Hello World");
    [java]System.out.println("Hello World");[/java]
    Für erledigte Threads dürft ihr den "erledigt"-Button anklicken!
    Über Dank freut sich jeder, der euch geholfen hat - ein Klick auf "Danke" kostet ja nicht mal was
    Blog: http://javaeffective.wordpress.com/

  3. #3
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.190
    Du kannst die Klasse einer Variable vom Type T nehmen.
    Der Code ist nicht besonders schön, zeigt aber worauf ich hinaus will.

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    public abstract class Generisch<T> {
        private ArrayList<T> list = new ArrayList<T>();
        private Class<?> valueClass;    
     
        public void addValue(T value)
        {
            this.list.add(value);
            valueClass= value.getClass();
        }
     
        public istDasDerGenerischeTyp(Class<?> testClass){
            return valueClass.equals(testClass);
        }
      }

    Code java:
    1
    2
    3
    
    public static void main(String[] args) {
               UnterGenerisch test = new UnterGenerisch();
           test.istDasDerGenerischeTyp(Integer.class) //gibt true zurueck

    Hab mal den folgenden Codeschnippel ausgetestet um zu sehen ob der Classenvergleich funktioniert - er funktioniert
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
        private <T> Boolean isClassOf(T value, Class<?> testClass){
            return value.getClass().equals(testClass);
        }
     
        public void test1(){
            try {
                Integer value = 1;
                assertTrue(isClassOf(value, Integer.class));
            } catch (Exception e) {
                fail(e.getMessage());
            }
        }
     
        public void test2(){
            try {
                Integer value = 1;
                assertTrue(! isClassOf(value, String.class));            
            } catch (Exception e) {
                fail(e.getMessage());
            }
        }
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  4. #4
    maho15 maho15 ist offline Mitglied Gold
    Registriert seit
    Jul 2002
    Beiträge
    165
    Zitat Zitat von yaslaw Beitrag anzeigen
    Du kannst die Klasse einer Variable vom Type T nehmen.
    Der Code ist nicht besonders schön, zeigt aber worauf ich hinaus will.
    Danke für die Antwort, schaut gut aus.
     

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

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

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    
    package de.tutorials;
     
    import java.lang.reflect.ParameterizedType;
    import java.lang.reflect.Type;
    import java.util.List;
     
    public class GenericTypeDetection {
        public static void main(String[] args) {
            Sub sub = new Sub();
            
            //Basis:
            System.out.println(((ParameterizedType) sub.getClass().getGenericSuperclass()).getActualTypeArguments()[0]);
     
            //Beispiel Implementierung:
            System.out.println(isInstanceOf(sub, List.class, String.class));
            System.out.println(isInstanceOf(sub, Base.class, String.class));
            System.out.println(isInstanceOf(sub, Base.class, CharSequence.class));
            System.out.println(isInstanceOf(sub, Base.class, Integer.class));
     
        }
     
        static class Base<T> {
        }
     
        static class Sub extends Base<String> {
        }
        
        static boolean isInstanceOf(Object o, Class<?> clazz, Class<?>... typeArguments) {
            boolean result = clazz.isInstance(o);
     
            if (result && o != null) {
                Object genericSuperClass = o.getClass().getGenericSuperclass();
                if (genericSuperClass instanceof ParameterizedType) {
                    /*
                     * flacher Vergleich... keine Unterstützung für GenericTypes á la List<Map<String,String>>
                     */
                    ParameterizedType parameterizedType = (ParameterizedType) o.getClass().getGenericSuperclass();
                    Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
                    for (int i = 0; i < typeArguments.length; i++) {
                        result &=    actualTypeArguments[i].equals(typeArguments[i]) 
                                  || typeArguments[i].isAssignableFrom((Class<?>)actualTypeArguments[i]);
                    }
                }
            }
     
            return result;
        }
    }

    Ausgabe:
    Code :
    1
    2
    3
    4
    5
    
    class java.lang.String
    false
    true
    true
    false

    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

Ähnliche Themen

  1. Instanznamen in der Klasse abfragen
    Von firestarterr im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 03.12.08, 10:29
  2. $_GET in funktion einer klasse abfragen?
    Von supersalzi im Forum PHP
    Antworten: 3
    Letzter Beitrag: 14.06.07, 13:31
  3. Wert von einer Klasse abfragen
    Von ksk im Forum Flash Plattform
    Antworten: 9
    Letzter Beitrag: 29.11.06, 12:36
  4. Mit Jstl einen Boolean Wert aus Java klasse abfragen und zugreifen
    Von NikDa im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 4
    Letzter Beitrag: 05.01.05, 10:13
  5. MySQL-Klasse - verschachtelte Abfragen
    Von pxlArtizzt im Forum Relationale Datenbanksysteme
    Antworten: 5
    Letzter Beitrag: 14.08.04, 23:36