我正在遵循这个问题的公认答案中提出的技术如何定义“类型析取”(联合类型)? https://stackoverflow.com/questions/3508077/does-scala-have-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]
所以它是一切的证据extends InputStream
?我感觉有一些上限<:
符号插入某处,我只是真的不知道在哪里......
或者说,上述问题的得票最高的答案中的“疯狂的 lambda 演算之类的东西”可以发挥作用?