Я написал пару функций, которые выглядят так:Дать обобщенную функцию, которая может принять Writer, а также в OutputStream
def myWrite(os: OutputStream) = {}
def myWrite(w: Writer) = {}
Теперь оба очень похожи, и я думал, что я хотел бы попробовать написать один параметризованная версия функции.
Я начал с типа с двумя методами, которые являются общими в Java OutputStream и Writer:
type Writable[T] = {
def close() : Unit
def write(cbuf: Array[T], off: Int, len: Int): Unit
}
Одна проблема в том, что OutputStream пишет Byte
и писатель пишет Char
, так что я параметризованных типа с T
.
Тогда я пишу функцию:
def myWrite[T, A[T] <: Writable[T]](out: A[T]) = {}
и попытаться использовать его:
val w = new java.io.StringWriter()
myWrite(w)
Результат:
<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)
Я попробовал несколько других комбинаций типов и параметров, пока не помогло.
Мой вопрос заключается в том, есть ли способ достичь этого вообще, и если да, то каким образом.
(Обратите внимание, что реализация myWrite потребуется, внутренне, чтобы знать тип T
, параметризующее метод записи(), потому что он должен создать буфер, как в новом ArrayT.)
ОБНОВЛЕНИЕ: " правильное»решение не работает, потому что ошибка в компиляторе: https://lampsvn.epfl.ch/trac/scala/ticket/2672
Вам не нужно заставлять литье использовать 'asInstanceOf'; простой 'myWrite (w: Writable [Char])' должен делать трюк, так как формально 'Writable [Char]' действует как суперкласс «Writer» с учетом определений типов. Кроме того, 'Nothing' происходит от механизма вывода типов с использованием наиболее конкретного типа. 'Nothing 'является подклассом для каждого другого класса, поэтому он использует это, если он не вынужден делать иначе (и он не понимает, что он вынужден делать иначе, он считает, что он может разрешить' T' независимо от 'A'). –
А, это многое объясняет. Благодарю. –