在下面的示例中,我想定义一个contains
和a
不是相同基本类型时不编译的b
方法。
contains1
中,如果a
为Seq[Int]
并且b为String
,则T
派生为Any
,并进行编译。这不是我想要的。contains2
暗示中,如果a
是Seq[Int]
并且b是String
,则它不会编译。行为就是我想要的。def contains1[T](a: Seq[T], b: T): Boolean = a.contains(b)
println(contains1(Seq(1,2,3), "four")) // false
def contains2[T: Ordering](a: Seq[T], b: T): Boolean = a.contains(b)
println(contains2(Seq(1,2,3), "four")) // compilation error
// cmd7.sc:1: No implicit Ordering defined for Any.
// val res7 = isMatched(Seq(1,2,3), "s")
^
// Compilation Failed
但是,有没有更简单的方法来实现与contains2
中相同的行为? Ordering
上下文绑定使我感到困惑,因为该方法与排序/排序完全无关。
答案 0 :(得分:9)
您可以使用一般类型约束运算符=:=
。
例如:
def contains[A,B](a: Seq[A], b: B)(implicit evidence: A =:= B): Boolean = a.contains(b)
然后:
println(contains1(Seq(1,2,3), "four")) //fails with Cannot prove that Int =:= String.
println(contains1(Seq("one"), "four")) //returns false
println(contains1(Seq("one", "four"), "four")) //true
正如LuisMiguelMejíaSuárez所注意到的,您也可以考虑使用B <:< A
代替A =:= B
。我不会详细说明这两者之间的区别,因为在链接的答案和文章中对此进行了描述,但总而言之,<:<
还将允许所有B
的子类型A
,而{ {1}}需要完全匹配的类型。