scala – 具有上限的联合类型
发布时间:2020-12-16 18:04:57 所属栏目:安全 来源:网络整理
导读:我正在遵循这个问题的接受答案中提出的技术 How to define “type disjunction” (union types)?是为了支持对方法的多类型参数进行类型检查. 隐含的“证据” @implicitNotFound(msg="Only String,Array[Byte] and InputStream are supported") sealed class
我正在遵循这个问题的接受答案中提出的技术
How to define “type disjunction” (union types)?是为了支持对方法的多类型参数进行类型检查. 隐含的“证据” @implicitNotFound(msg="Only String,Array[Byte] and InputStream are supported") sealed class Input[T] object Input{ implicit object ByteArrayWitness extends Input[Array[Byte]] implicit object StringWitness extends Input[String] implicit object InputStreamWitness extends Input[InputStream] } API方法 def foo[T: Input](param: T) = param match { case x: String => //... case x: Array[Byte] => //... case x: InputStream => //... case _ => throw new UnsupportedOperationException(s"not implemented for type ${param.getClass}") } 问题 这个编译 foo("test") foo(Array[Byte](123.toByte)) 但这不是(因为它不是具体的InputStream) foo(new ByteArrayInputStream("abc".getBytes("UTF-8"))) 我必须将其强制转换为超级类型以使其工作(此编译) foo(new ByteArrayInputStream("abc".getBytes("UTF-8")).asInstanceOf[InputStream]) 有没有办法改变 implicit object InputStreamWitness extends Input[InputStream] 所以它是扩展InputStream的一切证据?我有一种感觉,有一些上限<:符号插在某处,我真的不知道在哪里...... 或者这是从上述问题的最高投票答案的“疯狂的lambda微积分”来拯救? 解决方法
在T类型中输入Contra变量如:输入[-T],这意味着如果A是B的超类型,则输入[B]是输入[A]的超类型(反向“继承”).在你的情况下,它只是意味着Input [InputStream]知道如何处理所有子类输入类型InputStream(如ByteArrayInputStream)
我非常喜欢Rex Kerr在this问题中对逆变的解释.但还有很多其他的 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |