繁体   English   中英

如何使用不能为Any的类型param定义scala方法

[英]How to define a scala method with type param that cannot be Any

在下面的示例中,我想定义一个contains方法,如果ab不是相同的基类型,则不能编译。

  • contains1 impl中,如果aSeq[Int]而b是String ,则T被导出为Any ,并且它编译。 这不是我想要的。
  • contains2 impl中,如果aSeq[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上下文绑定让我困惑,因为该方法与排序/排序无关。

您可以使用通用类型约束 operator =:=

例如:

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 我不会详细说明这两者之间的差异,因为它在链接的答案和文章中有描述,但简而言之, <:<还允许所有BA的子类型,而=:=需要类型完全匹配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM