Scala 带上界的并集型

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

我在遵循这个问题的公认答案中提出的技巧 以支持方法的多类型参数的类型检查

隐含的“证据”

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

我必须将其转换为确切的超级类型才能使其工作(此编译)

有办法改变吗

    implicit object InputStreamWitness extends Input[InputStream]

所以它是扩展
InputStream
的一切的证据?我有一种感觉,在类型
T
中有一些上限
Make
Input
的反变量,比如:
Input[-T]
,这意味着如果a是B的超类型,那么Input[B]就是Input[a]的超类型(反向“继承”)。在您的例子中,这仅仅意味着Input[InputStream]知道如何处理所有子类Input type
InputStream
(比如
ByteArrayInputStream


我真的很喜欢雷克斯·克尔关于矛盾的解释。但是还有很多其他的

啊。。。我现在觉得很傻。。。虽然我变得更聪明了,但讽刺的是。非常感谢。
foo(new ByteArrayInputStream("abc".getBytes("UTF-8")))
foo(new ByteArrayInputStream("abc".getBytes("UTF-8")).asInstanceOf[InputStream])
    implicit object InputStreamWitness extends Input[InputStream]