为什么类型参数绑定T<;:T=Int时可比[T]失败? scala>class Foo[T(3:Int).asInstanceOf[compariable[Int]] res60:java.lang.Compariable[Int]=3 scala>新Foo(3) :13:错误:推断的类型参数[Int]不符合类Foo的类型参数界限[T

为什么类型参数绑定T<;:T=Int时可比[T]失败? scala>class Foo[T(3:Int).asInstanceOf[compariable[Int]] res60:java.lang.Compariable[Int]=3 scala>新Foo(3) :13:错误:推断的类型参数[Int]不符合类Foo的类型参数界限[T,java,scala,scala-2.8,Java,Scala,Scala 2.8,使用a 欢迎使用Scala版本2.8.0.final(Java热点(TM)客户端虚拟机,Java 1.6.021)。 键入要计算的表达式。 键入:有关详细信息的帮助。 scala>类Foo[T新Foo(3) res0:Foo[Int]=Foo@9aca82 如前所述,这个问题仍然没有答案(尽管“使用视图边界”解决了这个问题,这更有用)。答案很简单,Scala中的Int应该等同于Java中的Int,而Java中的Int根本不是一个类,因此,它甚至不能是可比的(虽然用defender方法在Java7

使用a

欢迎使用Scala版本2.8.0.final(Java热点(TM)客户端虚拟机,Java 1.6.021)。
键入要计算的表达式。
键入:有关详细信息的帮助。
scala>类Foo[T新Foo(3)
res0:Foo[Int]=Foo@9aca82

如前所述,这个问题仍然没有答案(尽管“使用视图边界”解决了这个问题,这更有用)。答案很简单,Scala中的
Int
应该等同于Java中的
Int
,而Java中的
Int根本不是一个类,因此,它甚至不能是
可比的
(虽然用defender方法在Java7中可以解决这个问题……我想知道他们是否会这么做)

给出的解决方案,使用视图绑定,在整个Scala中都被用来解决一个类的问题,这个类可以实现一些东西,但不能实现,因为它不在Scala的控制之下——即Java类


当然,程序员自己也可以使用它来处理库和框架中的类似内容,或者只是在库周围制作包装,给它一种规模感。

或者,您可以使用:

上下文绑定表示在调用构造函数时范围内存在隐式排序[T](或java.util.Comparator[T])的断言,相当于添加隐式参数:

class Foo[T: java.util.Comparator](val v: T)
这种方法的优点是,它允许您根据上下文使用替代顺序:

class Foo[T](val v: T)(implicit ev: Ordering[T])

谢谢你的链接。这非常有帮助,我一直想知道@Collin:
scalac-Xprint:typermyprogram.scala
会告诉你隐式的用法。键入
scalac-Xshow阶段
看看还有哪些其他阶段。很容易忘记(来自Java)像Int和Double这样的类型是基本类型,因此不能与Number和Comparable这样的引用类型一致。直到现在我才理解上下文边界,在阅读了你的答案之后,我继续阅读。非常有用,信息丰富。谢谢。
class Foo[T: Ordering](val v: T)
class Foo[T: java.util.Comparator](val v: T)
class Foo[T](val v: T)(implicit ev: Ordering[T])
// by default, new Foo("a", "c", "b").items == List("a", "b", "c")
class Foo[T: Ordering](xs: T*) {
   val items = xs.toList.sorted
}

// with this object in scope, 
// new Foo("a", "c", "b").items == List("c", "b", "a")
implicit val descending = Ordering[String].reverse