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:
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
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