Scala 带上界的并集型
我在遵循这个问题的公认答案中提出的技巧 以支持方法的多类型参数的类型检查 隐含的“证据” API方法Scala 带上界的并集型,scala,types,Scala,Types,我在遵循这个问题的公认答案中提出的技巧 以支持方法的多类型参数的类型检查 隐含的“证据” API方法 def foo[T: Input](param: T) = param match { case x: String => //... case x: Array[Byte] => //... case x: InputStream => //... case _ => throw new UnsupportedOperationExc
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
)
我必须将其转换为确切的超级类型才能使其工作(此编译)
有办法改变吗
implicit object InputStreamWitness extends Input[InputStream]
所以它是扩展
InputStream
的一切的证据?我有一种感觉,在类型T
中有一些上限MakeInput
的反变量,比如:Input[-T]
,这意味着如果a是B的超类型,那么Input[B]就是Input[a]的超类型(反向“继承”)。在您的例子中,这仅仅意味着Input[InputStream]知道如何处理所有子类Input typeInputStream
(比如ByteArrayInputStream
)
我真的很喜欢雷克斯·克尔关于矛盾的解释。但是还有很多其他的啊。。。我现在觉得很傻。。。虽然我变得更聪明了,但讽刺的是。非常感谢。
foo(new ByteArrayInputStream("abc".getBytes("UTF-8")))
foo(new ByteArrayInputStream("abc".getBytes("UTF-8")).asInstanceOf[InputStream])
implicit object InputStreamWitness extends Input[InputStream]