Verschachtelte Generics

G

Guest2

Gast
Moin,

ich schreibe aktuell an einer Bibliothek, mit einer Klassenstruktur, die sehr stark gekürzt und in ein KSKB gepresst etwa so aussieht:

Java:
package test;


public class KSKB {

    interface ASMBuffer<T> { }

    interface GLBuffer<T> extends ASMBuffer<T> { }

    static class ASMSampleBuffer<T> implements ASMBuffer<T> { }

    static class GLSampleBuffer<T> extends ASMSampleBuffer<T> implements GLBuffer<T> { }

    
    static class GLPointerBuffer<T extends ASMBuffer<?>> extends ASMSampleBuffer<T> implements GLBuffer<T> {

        @SafeVarargs
        public GLPointerBuffer(final T... values) {  }

    }
    
    
    @SafeVarargs
    static <T extends ASMBuffer<?>> GLPointerBuffer<T> bar(final T... values) {

        return new GLPointerBuffer<T>(values);

    }


    static void foo(final ASMBuffer<ASMBuffer<Character>> value) {

    }


    public static void main(final String[] args) {

        // Geht:
        final GLBuffer<ASMBuffer<Character>> v1 = new GLPointerBuffer<ASMBuffer<Character>>(new GLSampleBuffer<Character>());
        foo(v1);
        
        
        // Geht:
        foo(KSKB.<ASMBuffer<Character>> bar(new GLSampleBuffer<Character>()));

        
        // Geht nicht:
        final GLBuffer<GLBuffer<Character>> v2 = new GLPointerBuffer<GLBuffer<Character>>(new GLSampleBuffer<Character>());
        foo(v2);
        // The method foo(KSKB.ASMBuffer<KSKB.ASMBuffer<Character>>) in the type KSKB is not applicable
        // for the arguments (KSKB.GLBuffer<KSKB.GLBuffer<Character>>)
        
        
        // Geht nicht:
        final GLBuffer<GLBuffer<Character>> v3 = new GLPointerBuffer<>(new GLSampleBuffer<Character>());
        // Type mismatch: cannot convert from KSKB.GLPointerBuffer<KSKB.GLSampleBuffer<Character>> to
        // KSKB.GLBuffer<KSKB.GLBuffer<Character>>
        
        
        // Geht nicht:
        final GLBuffer<ASMBuffer<Character>> v4 = new GLPointerBuffer<>(new GLSampleBuffer<Character>());
        // Type mismatch: cannot convert from KSKB.GLPointerBuffer<KSKB.GLSampleBuffer<Character>>
        // to KSKB.GLBuffer<KSKB.ASMBuffer<Character>>
        
         
        // Geht nicht:
        foo(KSKB.bar(new GLSampleBuffer<Character>()));
        // The method foo(KSKB.ASMBuffer<KSKB.ASMBuffer<Character>>) in the type KSKB is not applicable
        // for the arguments (KSKB.GLPointerBuffer<KSKB.GLSampleBuffer<Character>>)

    }

}

Das, was in den Zeilen 39 bis 44 passiert, ist das was ich will und funktioniert so auch. Das Problem dabei ist, dass alle "ASM"-Klassen eigentlich interne Klassen sind. Diese bilden ein für sich abgeschlossenes (Maven-)Modul. Der Nutzer der Bibliothek soll sich nach Möglichkeit nicht mit diesen internen Klassen beschäftigen müssen.

Die Signatur von foo() kann ich auch nicht ändern, da diese auch von nicht "GL"-Klassen aufgerufen werden können muss. Außerdem liegt foo() eigentlich ebenfalls in einem eigenen Modul, zu dem ich keine weiteren Abhängigkeiten hinzufügen will. Das Modul von foo() kennt also kein "GL".

Meine Frage ist nun: Sieht jemand vielleicht eine Möglichkeit, wie das, was in den Zeilen 39 bis 44 passiert, formuliert werden kann, ohne explizit ASMBuffer hinschreiben zu müssen.

Viele Grüße,
Fancy
 

Landei

Top Contributor
Ich glaube, du vermanschst hier die Generics ganz gewaltig. Was soll dein [c]T[/c] sein? Eigentlich doch der im Buffer gespeicherte Typ, also z.B.
Code:
Character
. Dann macht aber sowas wie [c]GLBuffer<GLBuffer<Character>>[/c] keinen Sinn, und erst recht nicht [c]GLPointerBuffer<T extends ASMBuffer<?>>[/c] - das wären dann ja Buffer von Buffern, und das willst du hoffentlich nicht. Ich könnte mir vorstellen, das du vielleicht sowas in der Richtung willst:

Java:
    class GLPointerBuffer<T, B extends ASMBuffer<T>> extends ASMSampleBuffer<T> implements GLBuffer<T> {
 
        @SafeVarargs
        public GLPointerBuffer(final B... values) {  }
 
    }

Oder wenn du nicht so genau wissen musst, was der übergebene Buffer-Typ ist, reicht vielleicht sogar schon:

Java:
    class GLPointerBuffer<T> extends ASMSampleBuffer<T> implements GLBuffer<T> {
 
        @SafeVarargs
        public GLPointerBuffer(final ASMBuffer<T>... values) {  }
 
    }


Aber das ist nur geraten.

Was klar ist, ist das wenn du einerseits den Werte-Type ([c]Character[/c]) und andererseits z.B. einen unterliegenden oder internen Buffer-Typ (wie [c]ASMBuffer[/c]) hast, dass du nicht beide "an der gleiche Stelle" als Typ-Parameter haben kannst. Ob meine Idee von oben richtig ist, kann ich nicht sagen, ohne mehr über die "Familienverhältnisse" und Ideen hinter den Buffern zu wissen.
 
Zuletzt bearbeitet:
G

Guest2

Gast
Danke Dir für Deine Antwort! Die hat mich ein wenig in die Richtung geschubst, die ich brauchte.

Ich brauche aber tatsächlich "Buffer die Buffer enthalten". Der Hintergrund ist einfach, dass ich native Funktionen abbilden will, die als nativen Parametertyp z.B. "GLchar** pointer" haben (**!). Durch die Konstruktion mit dem [c]GLPointerBuffer<T extends ASMBuffer<?>>[/c] kann ich tatsächlich z.B. folgendes schreiben:

Java:
GLBuffer<Character> string1 = new GLStringBuffer(source1);
GLBuffer<Character> string2 = new GLStringBuffer(source2);
GLBuffer<GLBuffer<Character>> pointer = new GLPointerBuffer<>(string1, string2);
        
gl.glShaderSource(.., pointer,..);

Nativ liegt an der Adresse des GLPointerBuffers nacheinander die beiden Adressen der übergebenen GLStringBuffer. Damit der Compiler das annimmt, musste ich bisher [c]GLBuffer<ASMBuffer<Character>> pointer = ...[/c] schreiben. Beim aufräumen der API störte mich aber immer die Erwähnung des ASMBuffer.

Jetzt ist die Lösung inzwischen aber eigentlich ziemlich simpel, ich habe die Signatur von foo() (bzw. glShaderSource) einfach auf [c]foo(final ASMBuffer<? extends ASMBuffer<Character>> pointer)[/c] geändert (Bei den Buffern ist alles gleich geblieben.). Dadurch gibt der sich nun auch mit [c]GLBuffer<GLBuffer<Character>> pointer[/c] zufrieden. Hätte ich eigentlich auch vorher drauf kommen können. :oops:

Dank und Grüße
Fancy
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Z Datentypen Verschachtelte Generics Allgemeine Java-Themen 1
F KI / Machine Learning Parameter verschachtelte for Schleifen Allgemeine Java-Themen 2
F KI / Machine Learning Parameter verschachtelte for Schleifen Allgemeine Java-Themen 1
T Verschachtelte For-Schleife gibt falschen Wert zurück, Abbruchbedingung evtl. falsch? Allgemeine Java-Themen 9
A verschachtelte for-Schleife in einen Stream umwandeln? Allgemeine Java-Themen 4
O Datentypen Erstellung eines Containers, der verschachtelte Map-Strukturen beherbergen kann Allgemeine Java-Themen 0
D Verschachtelte HashMap initializieren Allgemeine Java-Themen 1
R n verschachtelte Schleifen? Allgemeine Java-Themen 14
Loyd Noch ne Regex-Frage: Verschachtelte Ausdrücke Allgemeine Java-Themen 4
T Verschachtelte Schleifen abbrechen Allgemeine Java-Themen 3
G Verschachtelte Treemaps, nach Value sortieren Allgemeine Java-Themen 11
J Verschachtelte ListIteratoren um in zwei Listen hin und herzugehen Allgemeine Java-Themen 5
S Verschachtelte Schleifen Allgemeine Java-Themen 9
O Verschachtelte Iteration: Innere Iteration abbrechen Allgemeine Java-Themen 3
A Parallele Threads oder verschachtelte? Allgemeine Java-Themen 7
S verschachtelte for-Schleife Allgemeine Java-Themen 2
M Verschachtelte Schleifen (unbekannte Tiefe) Allgemeine Java-Themen 3
R Verschachtelte Arrays Allgemeine Java-Themen 2
E Probleme beim Zugriff auf verschachtelte Vektoren Allgemeine Java-Themen 16
F verschachtelte Methoden auflösen Allgemeine Java-Themen 2
J Best Practice Generics mit Enum Allgemeine Java-Themen 3
H Kombination Interface und Abstrakte Klasse bei Generics Allgemeine Java-Themen 3
Zeppi Cast Object in Generics Allgemeine Java-Themen 4
P Generics und Arrays Allgemeine Java-Themen 6
M Generics / Typen Allgemeine Java-Themen 1
Kirby.exe InsertionSort mit Generics Allgemeine Java-Themen 33
Kirby.exe Vererbung bei Generics Allgemeine Java-Themen 7
H Klarnamen etc... (von Wie Generics lernen?) Allgemeine Java-Themen 26
D Wie Generics lernen? Allgemeine Java-Themen 26
L Compiler-Fehler Generics beim Anhängen von Predicates Allgemeine Java-Themen 1
W Vererbung Generics - mal wieder die verhaßte Rückwärtskompatibilität Allgemeine Java-Themen 2
S Verstaendnisfrage Generics Allgemeine Java-Themen 19
W Generics + Vererbung Allgemeine Java-Themen 47
I Methoden Generics-Methode Allgemeine Java-Themen 3
D Mit Generics arbeiten - Übungsaufgabe Allgemeine Java-Themen 3
K Factory Pattern: Mit Generics umgehen Allgemeine Java-Themen 6
G Generics Allgemeine Java-Themen 31
perlenfischer1984 Liste mit generics zurück liefern Allgemeine Java-Themen 8
Hacer Generics & Collections Allgemeine Java-Themen 8
Neumi5694 Interface Generics für Enum-Filterung verwenden Allgemeine Java-Themen 5
H Collector Generics Problem (incl. Stream & Lambda) Allgemeine Java-Themen 4
C Gemeinsame Oberklasse zweier Generics Allgemeine Java-Themen 10
erdmann Datentypen Methodendeklaration mit Generics Allgemeine Java-Themen 2
Neumi5694 Datentypen Generics Allgemeine Java-Themen 5
S Mit Generics Klasse erstellen die selbst T erweitert..? Allgemeine Java-Themen 4
Tarrew Generics - Type erasure Allgemeine Java-Themen 5
N Problem mit Generics und Interface Allgemeine Java-Themen 4
H Generics als Parameter Allgemeine Java-Themen 1
kaoZ Generics und Vererbung Allgemeine Java-Themen 3
A Datentypen Generics: Wie am besten auf Typparameter zugreifen Allgemeine Java-Themen 2
C Generics Objekt in ArrayList Allgemeine Java-Themen 2
vandread Kleine Generics Aufgabe aus einer Prüfung... wie ist das gemeint? Allgemeine Java-Themen 6
G Generics sind zu streng - oder ich zu naiv? Allgemeine Java-Themen 3
O Generics Allgemeine Java-Themen 42
M Problem mit Generics Allgemeine Java-Themen 10
M Generics (bounded wildcards statt Interface Bezeichnern) -- Sinn oder Unsinn? Allgemeine Java-Themen 2
darekkay Generics: Wildcard und Object Allgemeine Java-Themen 5
H Collections Generics und Reflection Allgemeine Java-Themen 6
F Google Guice + Generics + Vererbung Allgemeine Java-Themen 5
H Problem mit Java Generics Allgemeine Java-Themen 6
J Generics: Typparameter als Klasse zurückliefern Allgemeine Java-Themen 4
H Generics Allgemeine Java-Themen 5
P Probleme mit Generics Allgemeine Java-Themen 5
B Generics und primitve arrays Allgemeine Java-Themen 6
M Generics Allgemeine Java-Themen 11
1 Collections Generics, internes Verhalten Allgemeine Java-Themen 16
T Warnungsfreie Verwendung von Generics Allgemeine Java-Themen 11
M Probleme mit Generics Allgemeine Java-Themen 5
D Java Generics Allgemeine Java-Themen 8
2 Generics: bounded wildcards Allgemeine Java-Themen 4
J Generics / vermeiden von downcasts Allgemeine Java-Themen 2
2 Generics oder nicht? Allgemeine Java-Themen 8
E Problem mit Generics und Comparable Allgemeine Java-Themen 16
W Erweitern einer Klasse mit Generics Allgemeine Java-Themen 8
H Generics für Methode Allgemeine Java-Themen 14
N Überladen mit Hilfe von Generics Allgemeine Java-Themen 3
S Generics: Fuer Set<T> ein T-Klassenobjekt erhalten? Allgemeine Java-Themen 3
Q Der innere Typ von Generics? Allgemeine Java-Themen 3
N Generics-NullpointerException Allgemeine Java-Themen 7
2 Generics - Typ Allgemeine Java-Themen 12
P Generics Problem Allgemeine Java-Themen 10
S Type safety Warnings beim casten von Generics Allgemeine Java-Themen 6
N Generics Allgemeine Java-Themen 3
V Frage zu Generics Allgemeine Java-Themen 2
S java generics klassen deklaration Allgemeine Java-Themen 7
B hashtable für unterschiedliche Typen - mit Generics Allgemeine Java-Themen 8
E Generics Allgemeine Java-Themen 3
MQue Generics Allgemeine Java-Themen 4
R Problem mit Reflection und Generics Allgemeine Java-Themen 3
C Klassen, die aufeinander verweisen (mit Generics) Allgemeine Java-Themen 16
G Generics - W.card unter Nutzung von Annotationsklasse? Allgemeine Java-Themen 6
G sortieren von generics Allgemeine Java-Themen 10
G Generics in Map. Type of value abhängig vom key Allgemeine Java-Themen 3
A Generics Verständnisfrage Allgemeine Java-Themen 7
Z Generics funzt nicht? Allgemeine Java-Themen 2
T Generics Allgemeine Java-Themen 18
G ComboBox: Nur eine Art Klasse zulassen (Generics) Allgemeine Java-Themen 3
J Generics Expertenwissen? Allgemeine Java-Themen 5
S Generics-Problem Allgemeine Java-Themen 3
T Generics und Wil-dcards Allgemeine Java-Themen 8

Ähnliche Java Themen

Neue Themen


Oben