Ja, ich hab’s nicht so mit kreativen Namen…
Vor einigen Jahren hatte ich da mal was angefangen, und damals ziemlich viel (also… teilweise schon richtig viel) Zeit investiert. Es ging dabei um die Behandlung von Typen in Java. Ganz konkret unter anderem die Frage, wann ein Typ einem anderen zuweisbar ist. Also, im einfachsten (!) Fall sowas wie
Collection<? extends Number> = List<Integer> // Geht
Collection<? extends Number> = List<String> // Geht nicht
Damals hatte ich eigentlich Ziele, die noch deutlich darüber hinausgingen. Richtig kompliziert wird das, wenn man Typparameter unterstützen will:
Collection<T> = List<Integer> // Geht das?!
Was muss (oder darf) T
an dieser Stelle sein, damit die Zuweisung gültig ist? Das ist aber zu kompliziert (für mich) : Man muss da einen ganze “Typ-Kontext” aufbauen, in dem dann Schnitt- und Vereinigungsmengen irgendwelcher Bounds gebildet werden. (Der Code liegt lokal hier rum, aber … das ist nicht ausgereift, und deswegen auch nicht Teil der Library).
Die Library, in der die Teile liegen, die … einigermaßen “stabil” (und vielleicht für den einen oder anderen “nützlich”) sind, liegt hier:
Und die oben angedeutete Frage kann damit beantwortet werden:
// Build a type using a TypeBuilder (here, the type "List<? extends Number>")
Type listWithSubtypeOfNumber = Types
.create(List.class)
.withSubtypeOf(Number.class)
.build();
// or parse some type from a String
Type listWithIntegers =
Types.parse("java.util.List<java.lang.Integer>");
// Check assignability
System.out.println(Types.isAssignable(
listWithSubtypeOfNumber, listWithIntegers)); // true