加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 编写一个可以使用Writer和OutputStream的通用函数

发布时间:2020-12-16 19:24:07 所属栏目:安全 来源:网络整理
导读:我写了几个看起来像这样的函数: def myWrite(os: OutputStream) = {}def myWrite(w: Writer) = {} 现在两者非常相似,我想我会尝试编写一个参数化的函数版本. 我开始使用Java OutputStream和Writer中常见的两种方法的类型: type Writable[T] = { def close(
我写了几个看起来像这样的函数:

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)

(编辑:简化了答案,使其真正有效.)

(编辑:实际上,它不太有效 – 请参阅评论.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读