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

non*_*com 9 scala view traits

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

trait Set[A <: Ordered[A]] {
  def incl(x: A): Set[A]
  def contains(x: A): Boolean
}
Run Code Online (Sandbox Code Playgroud)

trait Set[A <% Ordered[A]] ...
Run Code Online (Sandbox Code Playgroud)

他还说,为了证明类型边界的可能性,<:/ <%是特征集所需的唯一变化.

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

Edm*_*984 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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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