有没有办法定义一个泛型类型参数,它可以是一小组类型之一?我想定义一个类型T,它只能是{Int,Long,Float,Double}之一。
答案 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类型来实现。