Ich schrieb ein paar Funktionen übernehmen können, die wie folgt aussehen:eine generische Funktion zu schreiben, die ein Schriftsteller sowie ein Output
def myWrite(os: OutputStream) = {}
def myWrite(w: Writer) = {}
Nun sind beide sehr ähnlich sind, und ich dachte, ich würde versuchen, einen einzigen zu schreiben parametrisierte Version der Funktion.
ich mit einem Typ mit den beiden Methoden begonnen, die in der Java Output und Writer gemeinsam sind:
type Writable[T] = {
def close() : Unit
def write(cbuf: Array[T], off: Int, len: Int): Unit
}
Ein Problem ist, dass Output schreibt Byte
und Verfasser schreiben Char
, so parametrisiert ich den Typen mit T
.
Dann schreibe ich meine Funktion:
def myWrite[T, A[T] <: Writable[T]](out: A[T]) = {}
und versuchen, es zu benutzen:
val w = new java.io.StringWriter()
myWrite(w)
Ergebnis:
<console>:9: error: type mismatch;
found : java.io.StringWriter
required: ?A[ ?T ]
Note that implicit conversions are not applicable because they are ambiguous:
both method any2ArrowAssoc in object Predef of type [A](x: A)ArrowAssoc[A]
and method any2Ensuring in object Predef of type [A](x: A)Ensuring[A]
are possible conversion functions from java.io.StringWriter to ?A[ ?T ]
myWrite(w)
ich ein paar andere Kombinationen der Typen und Parameter versucht, Bis jetzt vergeblich.
Meine Frage ist, ob es einen Weg gibt, dies überhaupt zu erreichen, und wenn ja wie.
(Beachten Sie, dass die Umsetzung von myWrite benötigt, intern, um den Typ zu wissen T
, die die Methode write() parametrisiert, weil es einen Puffer wie in neuen ArrayT erstellen muss.)
UPDATE: Der " richtige“Lösung funktioniert nicht, weil ein Fehler in dem Compiler: https://lampsvn.epfl.ch/trac/scala/ticket/2672
Sie müssen den Cast nicht zwingen mit 'asInstanceOf'; ein einfacher 'myWrite (w: Writable [Char])' sollte den Trick machen, da formal 'Writable [Char]' bei den Typdefinitionen als Oberklasse von 'Writer' fungiert. Außerdem kommt 'Nothing' von der Typ-Inferenz-Engine, die den genauesten möglichen Typ verwendet. 'Nothing' ist eine Unterklasse jeder anderen Klasse, also benutzt sie das, wenn sie nicht gezwungen wird, etwas anderes zu tun (und es merkt nicht, dass sie gezwungen ist, etwas anderes zu tun; sie denkt, dass sie' T' unabhängig von 'A' auflösen kann). –
Ah, das erklärt viel. Vielen Dank. –