为什么类型参数绑定 T <: 可比较 [T] 对于 T = Int 失败?

2022-09-03 17:05:42
scala> class Foo[T <: Comparable[T]](val x : T)
defined class Foo

scala> (3: Int).asInstanceOf[Comparable[Int]]  
res60: java.lang.Comparable[Int] = 3

scala> new Foo(3)                              
<console>:13: error: inferred type arguments [Int] do not conform to class Foo's type parameter bounds [T <: java.lang.Comparable[T]]
       new Foo(3)
       ^

第 2 个表达式是类型擦除的结果吗?

我该如何定义 Foo,以便我可以使用 Int 对其进行参数化,但仍然能够使用其实例变量执行一些排序行为?


答案 1

使用视图绑定

Welcome to Scala version 2.8.0.final (Java HotSpot(TM) Client VM, Java 1.6.0_21).
Type in expressions to have them evaluated.
Type :help for more information.

scala> class Foo[T <% Comparable[T]](val x : T)
defined class Foo

scala> new Foo(3)
res0: Foo[Int] = Foo@9aca82

答案 2

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

给出的解决方案,使用视图边界,在整个Scala中使用,以解决一个类的问题,该类可以实现某些东西,但不能实现某些东西,因为它不在Scala的控制之下 - 即Java类。

当然,程序员自己也可以使用它来处理库和框架中的类似内容,或者只是围绕库生成包装器,以赋予它一种类似 Scala 的感觉。


推荐