Scala 两种可能状态下的参数类型T
假设我们有一个方法Scala 两种可能状态下的参数类型T,scala,generics,Scala,Generics,假设我们有一个方法 def foo[T](param: T): Array[String] = { //preform smth } 我们如何确保T型有2个或多个可能的变体。例如,在我的特殊情况下,我希望T是String或我的自定义类型Bar请参见和。这项技术允许您编写 def size[T : (Int |∨| String)#λ](t : T) = t match { case i : Int => i case s : String => s.length }
def foo[T](param: T): Array[String] = {
//preform smth
}
我们如何确保T型有2个或多个可能的变体。例如,在我的特殊情况下,我希望T是String
或我的自定义类型Bar
请参见和。这项技术允许您编写
def size[T : (Int |∨| String)#λ](t : T) = t match {
case i : Int => i
case s : String => s.length
}
使用一个
sealed trait
,并使这两个/所有类型都继承自该sealed trait
。当然,这只适用于您控制的类型,因此它不适用于String
。此外,所有类型都必须在与密封特征相同的文件中定义
以下是一个例子:
sealed trait Tr
class Bar extends Tr
class Baz extends Tr
object Test {
def foo(t: Tr): Array[String] = t match {
case bar: Bar => Array("It's a bar")
case baz: Baz => Array("It's a baz")
}
}
如果你想严格控制T的类型,有没有理由不重载foo来支持你想要的类型?实际上foo调用了这样的重载方法,将param作为参数传递,但除了它有另一个我不想被复制的样板文件这很聪明,但是一想到使用unicode运算符,我就不寒而栗(∨, 关于第一个链接的问题(定义一个密封类和两个隐式对象):例如,在我的方法中,我想调用某个其他方法的重载版本,重载版本将这两种可能的类型作为参数。为什么这不能实现?编译器知道T的可能变体,所以当我在这样的senario中使用T时,为什么它会抱怨?