是否可以在Scala中执行以下操作:

class MyTest {
   def foo[A <: String _or_ A <: Int](p:List[A]) =  {}
}

也就是说,类型A可以是StringInt。这可能吗?

(类似问题here)

最佳答案

正如您所说的那样,这实际上是不可能的,但是您可以使用类型类模式来实现。例如,从here:

sealed abstract class Acceptable[T]
object Acceptable {
  implicit object IntOk extends Acceptable[Int]
  implicit object LongOk extends Acceptable[Long]
}

def f[T: Acceptable](t: T) = t

scala> f(1)
res0: Int = 1

scala> f(1L)
res1: Long = 1

scala> f(1.0)
<console>:8: error: could not find implicit value for parameter ev: Acceptable[Double]
f(1.0)
^

编辑

如果类和对象是同伴,则此方法有效。在REPL上,如果您在不同的行上键入每个字符(即,它们之间出现“结果”),则它们不是同伴。不过,您可以像下面这样输入:
scala> sealed abstract class Acceptable[T]; object Acceptable {
     |   implicit object IntOk extends Acceptable[Int]
     |   implicit object LongOk extends Acceptable[Long]
     | }
defined class Acceptable
defined module Acceptable

10-08 15:58