を取ることができ、一般的な機能を書く私はこのように見える機能のカップルを書いた:は、ライターなどの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
}
1つの問題は、OutputStreamのはByte
を書き込み、Writerは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)
私はパラメータの型と他のいくつかの組み合わせを試してみました、これまでのところ役に立たない。
私の質問は、これを達成するための方法があるかどうか、もしそうならば。
(それは新しいArrayTのようにバッファを作成する必要があるためmyWriteの実装は、write()メソッドをparametrizesタイプT
を知るために、内部的に、必要になることに注意してください。)
UPDATE: "をhttps://lampsvn.epfl.ch/trac/scala/ticket/2672
'asInstanceOf'を使って強制的にキャストする必要はありません。形式的に 'Writable [Char]'は型定義が与えられた 'Writer'のスーパークラスとして機能するので、単純な' myWrite(w:Writable [Char]) 'はこのトリックを行うべきです。また、「Nothing」は、可能な限り最も特殊な型を使用する型推論エンジンに由来します。 'Nothing'は他のすべてのクラスのサブクラスなので、そうしなければ強制的に使われます(そうでなければ強制されていることに気付かず、' A'とは独立に 'T'を解決できると思っています)。 –
ああ、それはたくさん説明します。ありがとう。 –