阅读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关键字更改为抽象类或更改绑定到类型绑定的视图会有所帮助。这是书中的错误吗?
答案 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不够成熟。但是,总有改进空间