在下面的示例中,我想定义一个contains
无法编译的方法a
and b
不属于同一基本类型。
- In
contains1
暗示,如果a
is Seq[Int]
b 是String
, T
导出为Any
,并且它可以编译。这不是我想要的。
- In
contains2
暗示,如果a
is 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
上下文绑定让我感到困惑,因为该方法与排序/排序根本无关。
你可以使用广义类型约束操作员=:=
.
例如:
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
有关广义类型约束的更多信息here and here.
正如 LuisMiguelMejíaSuárez 注意到的,您也可以考虑使用B <:< A
代替A =:= B
。我不会详细说明这两者之间的差异,因为它在链接的答案和文章中进行了描述,但简而言之,<:<
也将允许所有B
这是一个子类型A
, while =:=
需要类型完全匹配。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)