例如,我想检查a是否大于b,这是我的代码
def gt(a:Any,b:Any):Boolean = a match{
case a:Ordered[Any] => (a compareTo b ) > 0
case _ => false
}
然而,有更准确的方法来实现这个?因为编译器会发出警告:
<console>:8: warning: non-variable type argument Any in type pattern Comparable[Any] is unchecked since it is eliminated by erasure
case a:Comparable[Any] => (a compareTo b ) > 0
隐式视图应该可以完成工作,但我想做的就是有一个功能 使用参数(a:Any,b:Any),而不是类型参数。在java中,代码可能是这样的,但我不知道如何用Scala方式实现它
public static boolean gt(Object a, Object b){
if(a instanceof Comparable && b.getClass() == a.getClass() ){
return ((Comparable) a).compareTo(b) > 0;
}else {
return false;
}
}
再次更新,我已经提出了一个可行的解决方案,但我知道这不是最好的方法,我会打开这个问题
def ls(a: Any, b: Any): Boolean = {
a match {
case (a: Comparable[Any]) => (a compareTo b) < 0
case _ => false
}
}
答案 0 :(得分:4)
对于某些非常基本的情况(例如gt(2,1)
),您的方法将返回错误。你可能正在寻找:
def gt[T <% Ordered[T]](a:T, b:T) = a > b
在您的示例中,您避免指定通用参数(参数T
)。这保证了函数的参数具有相同的类型,从而实现了某种类型的安全性。
您希望订购该类型参数。在Scala中实现它的方式是Ordered
trait,它将self类型作为泛型参数。
语法<%
表示需要从T
到Ordered[T]
进行隐式转换(称为视图绑定类型参数)。对于Scala中的所有标准有序类型(例如Int
,Char
等)都是如此。如果没有此视图绑定,编译器就无法知道泛型参数是否必需。
最后,Ordered
上有>
函数,因此您无需使用compareTo
,因为它已经实现了。