Yik*_*han 9 types scala type-constraints
在下面的示例中,我想定义一个contains方法,如果a和b不是相同的基本类型,则不会编译。
contains1impl中,如果ais Seq[Int]和b is String,T则派生为be Any,并进行编译。这不是我想要的。contains2impl中,如果ais 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
Run Code Online (Sandbox Code Playgroud)
但是,是否有一种更简单的方法来实现与中相同的行为contains2?Ordering上下文绑定使我感到困惑,因为该方法与排序/排序完全无关。
您可以使用广义类型约束运算符=:=。
例如:
def contains[A,B](a: Seq[A], b: B)(implicit evidence: A =:= B): Boolean = a.contains(b)
Run Code Online (Sandbox Code Playgroud)
然后:
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
Run Code Online (Sandbox Code Playgroud)
正如LuisMiguelMejíaSuárez注意到的那样,您也可以考虑使用B <:< A而不是A =:= B。我不会详细说明这两者之间的区别,因为在链接的答案和文章中对此进行了描述,但<:<总而言之B,它也允许所有属于的子类型A,而=:=需要完全匹配的类型。