generics - Scala 泛型:Int不符合可以比较?

  显示原文与译文双语对照的内容

以下 Scala 声明是可以的:


trait Base[B <: Base[B,M,ID], M <: Meta[B,M,ID], ID <: Comparable[ID]] {


//...


}



trait Meta[B <: Base[B,M,ID], M <: Meta[B,M,ID], ID <: Comparable[ID]] extends Ordered[Meta[_,_,_]] {


//...


}



trait BaseWithID[B <: BaseWithID[B,M,ID], M <: Meta[B,M,ID], ID <: Comparable[ID]] extends Base[B,M,ID] with Ordered[B] {


//...


}



trait BaseWithIntID[B <: BaseWithIntID[B,M,ID], M <: MetaWithIntID[B,M,ID], ID <: Comparable[ID]] extends BaseWithID[B,M,ID] {


//...


}



trait MetaWithIntID[B <: BaseWithIntID[B,M,ID], M <: MetaWithIntID[B,M,ID], ID <: Comparable[ID]] extends Meta[B,M,ID] {


//...


}



但以下两个不是:


trait BaseWithIntID[B <: BaseWithIntID[B,M], M <: MetaWithIntID[B,M]] extends BaseWithID[B,M,Int] {


//...


}



trait MetaWithIntID[B <: BaseWithIntID[B,M], M <: MetaWithIntID[B,M]] extends Meta[B,M,Int] {


//...


}



区别在于我在BaseWithIntID和MetaWithIntID中删除了ID类型参数,并在它们各自的基本特征中明确地。 但这并没有编译,这意味着Int在 Scala 中是不可比的? 如果是的话我是怎么做的? 我尝试了排序,而不是比较,这并没有区别。

我正在使用 Eclipse,通常情况下,错误消息是没有帮助的:


type arguments [B,M,Int] do not conform to trait BaseWithID's type parameter bounds [B <: BaseWithID[B,M,ID],M <: Meta[B,M,ID],ID <: java.lang.Comparable[ID]]



它只是说有什么错误,但不是哪种类型参数是错误的,原因为。 我想看看这个问题,我想我可以尝试"。id <% 可以比较的[ID]",但这在特性声明中并不合法。

实际上,这两种方法都不适用( 使用相同的错误消息):


trait TestBase extends BaseWithID[TestBase,TestMeta,Int]



trait TestMeta extends Meta[TestBase,TestMeta,Int]



时间: 原作者:

Int实际上在 Scala 中是不可比拟的,当然因为它实际上是作为 java int 实现的,而不是 java.lang.Integer 。 我不确定这将是不可以能的,C# struct ( 值类型) 可以能实现接口,但这并不完成。

通常情况下,在,类型的隐式范围内有一个可以用的Ordering,它的中包含 ID : Ordering

在一个简单的例子上:


import Ordering.Implicits._


def max[A : Ordering](x: A, y: A) : A = if (x> y) then x else y



这将把排序( 跟 java.util.Comparator 是一样的) 传递给函数。 实际上,声明


def max[A : Ordering](x: A, y: A)



转换为


def max[A](x: A, y: A)(implicit ev: Ordering[A])



ev 是一个新名称。 如果A: 排序出现在类而不是方法定义中,则转换为构造函数的隐式参数。 这比强制使用 Comparable ( Scala 中的Ordered ) 更灵活,因为它可以能在不是你的类上使用,并且没有实现可以比较。 如果只反转默认的Odering,也可以在同一类的不同之间进行选择: 有一个 def reverse : OrderingOrdering 上实现的方法。

不可以能的是,虚拟机不能将调用内联到比较方法,但是不可以能使用通用的接口方法。

在java中实现 Comparable<T>的类型通过对象 Ordering 中的隐式方法( Ordered ),自动在隐式范围内获取 Ordering 。 java Comparator<T> 也可以转换为 Ordering ( Ordering.comparatorToOrdering ) 。

导入 Ordering.Implicits._ 允许你在一个 Ordering[A] 处于隐式范围时使用好的x> y 语法。

原作者:
...