Datentypen Generics: Exacten Typ ermitteln

MattHHDE

Mitglied
Hi
Ich glaub was ich will geht mit der momentanen Java Version nicht aber ich will dennoch mal nachfragen:
Folgender Code (nur ein kleiner Ausschnitt :) ):
Java:
public <T extends IIdentifiable<?>> T getKid(....)
            final Method mth = getClass().getMethod("getKid");
            final Class<?> retType = mth.getReturnType();
...
Ist es möglich den EXACTEN Type von T zu ermitteln? Also wenn z.B. IFoo von IIdentifiable ableitet ist es dann möglich herauszufinden ob T vom Typ IFoo ist?
Java:
retType.isAssignableFrom(IFoo.class)
funktioniert leider nicht und liefert nur IIdentifiable...

Bei 1.5 wars so das die Generischen Information zur Laufzeit nicht mehr da sind. Ich dachte aber eigentlich dass sich dies mit 1.6 geändert hätte?
Oder gibts andere Wege (außer ein cast nach T und dann jedes mal die Exception zu fangen...)

Danke
PS: Ich weiß das Reflection hier ne "doofe" Art ist daran zu kommen, mir viel nur nicht anderes ein.
 

Marco13

Top Contributor
???:L Vermutlich nicht, aber es ist nicht 100% klar, was du willst. Mit retType.getClass() kriegt man die Klasse des Typs, retType selbst sollte schon der Typ sein, T ist zur Laufzeit nicht bekannt, außer wenn es eben gerade retType ist :rolleyes: Poste vielleicht mal mehr (am besten compilierbaren) Code...
 

MattHHDE

Mitglied
OK, dies wird ein wenig länger:
Basis für Test Code:
Java:
    private interface IParent1 {

    }

    private interface IParent2 {

    }

    private interface IKidString extends IIdentifiable<String> {

    }

    private interface IKidInteger extends IIdentifiable<Integer> {

    }

    private interface IKidIntegerALittleDifferent extends IIdentifiable<Integer> {

    }

    private class KidString implements IKidString {
        private final String key;

        /**
         *
         */
        public KidString(final String key) {
            this.key = key;
        }

        /** {@inheritDoc} */
        @Override
        public String getKey() {
            return key;
        }

        /** {@inheritDoc} */
        @Override
        public String toString() {
            return "StringType " + key;
        }
    }

    private class KidInteger implements IKidInteger {
        private final Integer key;

        /**
         *
         */
        public KidInteger(final Integer key) {
            this.key = key;
        }

        /** {@inheritDoc} */
        @Override
        public Integer getKey() {
            return key;
        }

        /** {@inheritDoc} */
        @Override
        public String toString() {
            return "IntegerType " + key;
        }
    }

    private class KidIntegerALittleDifferent implements IKidIntegerALittleDifferent {
        private final Integer key;

        /**
         *
         */
        public KidIntegerALittleDifferent(final Integer key) {
            this.key = key;
        }

        /** {@inheritDoc} */
        @Override
        public Integer getKey() {
            return key;
        }

        /** {@inheritDoc} */
        @Override
        public String toString() {
            return "IntegerALittleDifferentType " + key;
        }
    }

Test Code:
Java:
@Test
    public void getKidMultipleType() {
        sut.registerParentKidRelationShip(IParent1.class, IKidString.class, IKidInteger.class,
            IKidIntegerALittleDifferent.class);
        final KidString kid1 = new KidString("A");
        final KidString kid2 = new KidString("B");
        final KidInteger kid3 = new KidInteger(1);
        final KidInteger kid4 = new KidInteger(2);
        final KidIntegerALittleDifferent kid5 = new KidIntegerALittleDifferent(2);

        sut.addParent(parent1);
        sut.addKid(parent1, kid1);
        sut.addKid(parent1, kid2);
        sut.addKid(parent1, kid3);
        sut.addKid(parent1, kid4);
        sut.addKid(parent1, kid5);

        final IKidString kid1Ret = sut.getKid(parent1, "A");
        Assert.assertSame(kid1, kid1Ret);

        final IKidString kid2Ret = sut.getKid(parent1, "B");
        Assert.assertSame(kid2, kid2Ret);

        final IKidInteger kid3Ret = sut.getKid(parent1, 1);
        Assert.assertSame(kid3, kid3Ret);

        final IKidInteger kid4Ret = sut.getKid(parent1, 2); //Problem: sut liefert IKidIntegerALittleDifferent obwohl es IKidInteger sein sollte. Das sut hat daher keine Ahnung ob der return type passt
        Assert.assertSame(kid4, kid4Ret);

        final IKidIntegerALittleDifferent kid5Ret = sut.getKid(parent1, 2);
        Assert.assertSame(kid5, kid5Ret);

    }

Hier der code der Implementierung (welcher nicht funktioniert)
Java:
    public <T extends IIdentifiable<?>> T getKid(final Object parent, final Object key) {
        if (key == null || parent == null) {
            throw new NullPointerException("Neither parent nor key may be null");
        }
        final Set<? extends IIdentifiable<?>> relationShip = parentToKidMap.get(parent);
        if (relationShip == null) {
            throw new RuntimeException("No Parent for " + parent);
        }

        try {
            final Method mth = getClass().getMethod("getKid", Object.class, Object.class);
            final Class<?> retType = mth.getReturnType();

            for (final IIdentifiable<?> iFace : relationShip) {
                if (retType.isAssignableFrom(iFace.getClass()) && iFace.getKey().equals(key)) {
                    return (T) iFace;
                }
            }
        } catch (final SecurityException e) {
            // Nothing to do
        } catch (final NoSuchMethodException e) {
            // Nothing to do
        }

        return null;
    }

Wenn ichs richtig verstanden hab ist das der Fall von "Reified Generics", oder? Und anscheinend ist wohl nicht klar ob das mit 1.7 gefixt wird...
Oder gibts andere Wege das zu coden (mit Ausnahme den Ret-Type als Parameter mitzugeben...)
 

Noctarius

Top Contributor
Die Typeinformationen sind auch in 1.6 nur für Klassen abrufbar. Damit kannst du Generic-Typen von Klassen abfragen ([c]class Foo implements Comparable<Foo>[/c] aber nicht von Methodenparametern oder -returntypes.

Eine Möglichkeit wäre diese zur Compile-Time durch ein passendes Plugin (Ant / Maven) generieren und hinterlegen zu lassen. Dann könnte man diese auch wieder zugänglich machen.

Generell würde dein Code aber funktionieren, da einfach auf den aktuellen Type der Variable gecastet wird (wenn's nicht geht fliegt eine ClassCastException).

Java:
Foo foo = getKid(...);
Dies beinhaltet bei deinem Code einen expliziten Cast nach Foo.

Eine Alternative wäre:
Java:
public <T extends IdentifiedType> T getKid(..., Class<T> clazz)
 
Zuletzt bearbeitet:

Noctarius

Top Contributor
Japp ich denke das auch an manchen Stellen. Ich bin mir jetzt nicht mal sicher ob das noch auf dem Java 7 oder schon auf dem Java 8 Plan steht.

Z.B. hätte ich hier gerne den generischen Typen: [c]public void foo(@Child List<Foo> foos)[/c] da es aber nicht geht habe ich mir z.B. so beholfen [c]public void foo(@Child(listType=Foo.class) List<Foo> foos)[/c].
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Generics machen mich verrückt Java Basics - Anfänger-Themen 8
John_Sace Homogene Realisierung von Generics in Java ? Java Basics - Anfänger-Themen 19
MarvinsDepression Datentypen Generics: Erste Berührungen Java Basics - Anfänger-Themen 6
M Generics Vererbung Listen Java Basics - Anfänger-Themen 2
Cassy3 Generics - CompareTo Java Basics - Anfänger-Themen 21
T Collections Sind Subklassen-Objekte in Listen mit Generics erlaubt? Java Basics - Anfänger-Themen 16
districon Generics implementieren Java Basics - Anfänger-Themen 2
CptK Überprüfen ob übergebenes Objekt zu Generics passt Java Basics - Anfänger-Themen 2
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
B Hilfe bei Generics Java Basics - Anfänger-Themen 11
G Generics Compilerfehler Java Basics - Anfänger-Themen 6
G Generics Methoden Java Basics - Anfänger-Themen 7
G Generics Java Basics - Anfänger-Themen 3
L Generics Tripel Java Basics - Anfänger-Themen 26
W Fragen zu Generics Java Basics - Anfänger-Themen 14
S Hilfe. Generics und BiFunctions Java Basics - Anfänger-Themen 10
X Wie Generics richtig benutzen ? Java Basics - Anfänger-Themen 5
S Allgemeine Frage über Generics und Vererbungen Java Basics - Anfänger-Themen 5
S Generics-Problem: Class, Class<?>, Class<Object> Java Basics - Anfänger-Themen 4
I Java Generics factory method Java Basics - Anfänger-Themen 2
M Verständnisfrage zu Generics Java Basics - Anfänger-Themen 7
I Generics und Comparable Java Basics - Anfänger-Themen 14
G Generics mit ? und Diamantoperator Java Basics - Anfänger-Themen 4
G Generics: Wildcard ? Java Basics - Anfänger-Themen 12
D Generics methode Java Basics - Anfänger-Themen 2
I Frage zu Generics und Wildcards Java Basics - Anfänger-Themen 2
N Generics und Casting eines Objekts Java Basics - Anfänger-Themen 1
A Generics Java Basics - Anfänger-Themen 6
A Vererbung/Interfaces/Generics Java Basics - Anfänger-Themen 12
W Generics - Typ zurückbekommen Java Basics - Anfänger-Themen 4
Dimax Erste Schritte Generics von Profis leicht erklärt Java Basics - Anfänger-Themen 7
C Warum funktioniert 'instanceof' bei generics nicht? Java Basics - Anfänger-Themen 4
J Collections Generics: Typ wird nicht erkannt Java Basics - Anfänger-Themen 7
D Generics ArrayList: Bug im Quellcode Java Basics - Anfänger-Themen 14
C Generics Java Basics - Anfänger-Themen 8
M Generics getter und setter Methoden Java Basics - Anfänger-Themen 4
T Generics in Java... Java Basics - Anfänger-Themen 9
J Generics Java Basics - Anfänger-Themen 3
J Generics Datentypen vergleichen Java Basics - Anfänger-Themen 16
V Generics / eigene Liste Java Basics - Anfänger-Themen 4
O Generics - Implementierung Java Basics - Anfänger-Themen 7
Shizmo Frage zu Generics Java Basics - Anfänger-Themen 3
F Multiple Generics Java Basics - Anfänger-Themen 10
G Datentypen verschiedene Objekte in eine ArrayList, Generics Java Basics - Anfänger-Themen 2
H Typsicherheit/Generics Java Basics - Anfänger-Themen 1
U Java generics funktioniert nicht Java Basics - Anfänger-Themen 0
Tarrew Generics: Erste gemeinse Oberklasse als Rückgabewert Java Basics - Anfänger-Themen 1
N Generics Vererbung Wildcard Interface Java Basics - Anfänger-Themen 8
S Generics und Comparable Interface Java Basics - Anfänger-Themen 5
A Generics Java Basics - Anfänger-Themen 4
M Frage zu Generics in Klassen, Abstrakten Klassen und Interfaces Java Basics - Anfänger-Themen 5
R Compiler-Fehler Generics Problem Java Basics - Anfänger-Themen 2
K Interface Generics, Interfaces und Listen - ich bin verwirrt. Java Basics - Anfänger-Themen 7
K Generics bei Klassen- und Interfacedeklarationen Java Basics - Anfänger-Themen 3
D toArray und Generics Java Basics - Anfänger-Themen 2
D Zwei Generics beim Überladen von Methoden Java Basics - Anfänger-Themen 3
C Erste Schritte Filter für Generics oder ähnliches Java Basics - Anfänger-Themen 2
M Frage zu Generics-Deklaration Java Basics - Anfänger-Themen 5
S Frage zu Collection-Generics in Subklassen Java Basics - Anfänger-Themen 6
J Java Generics - Frage zu Types Java Basics - Anfänger-Themen 2
M <T> Generics Java Basics - Anfänger-Themen 7
B Interface Generics: prüfen ob Interface deklariert wird Java Basics - Anfänger-Themen 18
T Polymorphie Generics-Problem Java Basics - Anfänger-Themen 2
B Hilfe beim Verständnis zu Generics Java Basics - Anfänger-Themen 7
J Array Generics Java Basics - Anfänger-Themen 3
J Generics casten Java Basics - Anfänger-Themen 14
J Generics wildcard Java Basics - Anfänger-Themen 6
E Listen und Generics Java Basics - Anfänger-Themen 9
X Generics Java Basics - Anfänger-Themen 6
M Datei einlesen mit generics? Java Basics - Anfänger-Themen 9
D Warum sind Generics mit Vorsicht zu genießen? Java Basics - Anfänger-Themen 6
M OOP Mit Generics auf Methoden zugreifen? Java Basics - Anfänger-Themen 10
S Generics Java Basics - Anfänger-Themen 4
G Generics kein Zugriff auf getter eines Objekts Java Basics - Anfänger-Themen 4
L Datentypen Problem mit Generics und null Java Basics - Anfänger-Themen 6
E Klassen java.util.ArrayList<E> als Generics Java Basics - Anfänger-Themen 16
W Interface Problem mit Generics Java Basics - Anfänger-Themen 2
M OOP Generics und Wildcards Java Basics - Anfänger-Themen 3
D Generics - Warnmeldungen Java Basics - Anfänger-Themen 2
M Polymorphie generics einsteigerprobleme Java Basics - Anfänger-Themen 3
D Vererbung Generics und Vererbung Java Basics - Anfänger-Themen 8
C Generics Array Java Basics - Anfänger-Themen 43
D Fehler mit generics Java Basics - Anfänger-Themen 10
S Generics - CaseInsensitiveMap selber schreiben? Java Basics - Anfänger-Themen 5
K Datentypen Generics Java Basics - Anfänger-Themen 3
P Comparable und Generics Java Basics - Anfänger-Themen 6
I Generics (Subtypen) Java Basics - Anfänger-Themen 17
N Typeinschränkung bei Generics Java Basics - Anfänger-Themen 13
C Generics und Cast Java Basics - Anfänger-Themen 5
H Generics werden in -source 1.2 nicht unterstützt Java Basics - Anfänger-Themen 16
N Generics und Interfaces Java Basics - Anfänger-Themen 5
S Generics und "generische Feldzuweisungen" Java Basics - Anfänger-Themen 5
lumo Java Generics Java Basics - Anfänger-Themen 19
M verlinkte Liste mit generics Java Basics - Anfänger-Themen 7
capgeti Datentypen Static methoden aus Superklasse mit Generics definieren? Java Basics - Anfänger-Themen 9
S Generics und Typerkennung Java Basics - Anfänger-Themen 7
A Cast ohne Warnung bei Generics Java Basics - Anfänger-Themen 2
B Java Listen und Generics Java Basics - Anfänger-Themen 35
O Abstract Method & Generics Java Basics - Anfänger-Themen 10
K Aufgabe Generics Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben