Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 两种可能状态下的参数类型T_Scala_Generics - Fatal编程技术网

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时,为什么它会抱怨?