Scala by Example - 具有上下文边界错误的trait类型参数?

时间:2011-12-20 13:30:04

标签: scala view traits

阅读Scala by Example书籍,当Martin解释第54页的类型界限时,有一个例子:

trait Set[A <: Ordered[A]] {
  def incl(x: A): Set[A]
  def contains(x: A): Boolean
}

trait Set[A <% Ordered[A]] ...

进一步在第55页。他还说&lt;:/&lt;%是特征集所需的唯一变化,以证明类型边界的可能性。

但是,当我用自己的代码重复示例时,IDE会抱怨特征可能没有视图边界,只有类型边界。将trait关键字更改为抽象类或更改绑定到类型绑定的视图会有所帮助。这是书中的错误吗?

1 个答案:

答案 0 :(得分:7)

让我们使用名为REPL的强大工具来了解正在发生的事情:

scala>  trait Example[A<:Ordered[A]] { def contains(x:A):Boolean }
defined trait Example

scala>  class Example2[A<%Ordered[A]]( val a:A) { def isLower(otherA:A):Boolean = a< otherA }
defined class Example2

scala>  :javap Example
Compiled from "<console>"
public interface Example{
    public abstract boolean contains(scala.math.Ordered);
}


scala>  :javap Example2
Compiled from "<console>"
public class Example2 extends java.lang.Object implements scala.ScalaObject{
    public java.lang.Object a();
    public boolean isLower(java.lang.Object);
    public Example2(java.lang.Object, scala.Function1);
}

如您所见,视图绑定成为Example2构造函数的第二个参数。由于特征没有构造函数,显然不可能提供视图边界。

为什么在以前的版本中可以实现这一点对我来说是个谜(可能在特征中创建了一个额外的Function1 val并由编译器填充?)

关于Scala进化的问题,它是成熟而强大的。你可以期待主要版本之间的变化(2.8,2.9,2.10),但我不认为scala不够成熟。但是,总有改进空间