将Scala类型限制为一组类型之一

时间:2016-01-20 17:37:40

标签: scala generics

有没有办法定义一个泛型类型参数,它可以是一小组类型之一?我想定义一个类型T,它只能是{Int,Long,Float,Double}之一。

1 个答案:

答案 0 :(得分:2)

Daniel Landgon的上述评论指出了正确的方向。
如果有人急于单击该链接,则:

@annotation.implicitNotFound("It can not be proven that ${T} is of type Int, Long, Float or Double")
sealed trait Foo[T]

object Foo {
  implicit val intFoo: Foo[Int] = new Foo[Int]{}  
  implicit val LongFoo: Foo[Long] = new Foo[Long]{}
  implicit val FloatFoo: Foo[Float] = new Foo[Float]{}
  implicit val DoubleFoo: Foo[Double] = new Foo[Double]{}
}

使用:

def bar[T](t: T)(implicit ev: Foo[T]): Unit = println(t)

我们得到:

bar(5)        // res: 5
bar(5.5)      // res: 5.5
bar(1.2345F)  // res: 1.2345

bar("baz")    // Does not compile. Error: "It can not be proven that String is of type Int, Long, Float or Double"
bar(true)     // Does not compile. Error: "It can not be proven that Boolean is of type Int, Long, Float or Double"

这也可以通过Miles Sabin的无形状库中提供的 union类型来实现。