23. XML Inhaltsverzeichnis 25. Universelle Warteschlange

24. Einschränkung des Typparameters

Die XML-Lösung ist etwas typunsicher: Wenn die Klasse eines Elements keinen String-parametrisierten Konstruktor besitzt, wird von getConstructor eine NoSuchMethodException ausgelöst[1]. Eine typsicherere Alternative hierzu ist, vom aktuellen Typparameter eine Fabrikmethode zu fordern. Hierzu ist muss eine Schnittstelle der Art

trait FromString { // Fabrikmethode für Wiederherstellung aus Text

   fromString(s: String): FromString }  

definiert und der Typparameter eingeschränkt werden:

class PersArrayQ[E <: FromString](size: Int)

   extends ArrayQ[E](size) with PersQ[E] { …

Dann kann diese Klasse nur mit aktuellen Typparametern instanziiert werden, die die Schnittstelle FromString implementieren, d.h. für alle Elemente kann die Methode fromString aufgerufen werden. In der Methode load müssen wir dann statt dem reflect.Constructor-Objekt ein reflect.Method-Objekt besorgen, mit dessen invoke- Methode fromString aufgerufen und so das einzutragende Element instanz erzeugt werden kann:

val methode = klasse.getMethod("fromString", string)

// java.lang.reflect.Method stellt die Methode fromString()

// mit einem String-Parameter dar; hier wird E <: FromString benötigt

val instanz = methode.invoke(null, wert).asInstanceOf[E];

23. XML Inhaltsverzeichnis 25. Universelle Warteschlange

[1] Der Compiler kann nur die Anwesenheit einer Methode überprüfen, nicht die eines Konstruktors.


Version: 5. Dezember 2010

© Prof. Solymosi, 2010, Beuth-Hochschule für Technik Berlin