scala – 编写一个可以使用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和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) 我尝试了一些其他类型和参数的组合,到目前为止无济于事. 我的问题是,是否有办法实现这一目标,如果有的话. (注意,myWrite的实现在内部需要知道参数化write()方法的类型T,因为它需要像在新的ArrayT中一样创建缓冲区.) 更新:“正确”的解决方案不起作用,因为编译器中的错误:https://lampsvn.epfl.ch/trac/scala/ticket/2672 解决方法
首先,您不需要在myWrite中参数化A.您的目标类不是通用的!其次,您不需要显式允许子类 – 只需让继承为您完成.
def myWrite[T](out: Writable[T]) = {} 现在该方法可以推断出类型T.只要你不是因为某种原因需要真正的A类型,这对你有用: myWrite(new StringWriter) 但是,你会遇到一个问题: def myWrite[T](out: Writable[T]) = new Array[T](0) // Doesn't work! 问题是这是通用代码.它不知道T是什么 – 它可能是任何东西!所以你需要告诉编译器传入标识T的信息: def myWrite[T : ClassManifest](out: Writable[T]) = new Array[T](0) (编辑:简化了答案,使其真正有效.) (编辑:实际上,它不太有效 – 请参阅评论.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |