阅读《Scala by Example》一书,Martin 在第 54 页解释类型界限时有一个示例:
trait Set[A <: Ordered[A]] {
def incl(x: A): Set[A]
def contains(x: A): Boolean
}
and
trait Set[A <% Ordered[A]] ...
第 55 页进一步说明。他还表示,<:>
然而,当我用自己的代码重复该示例时,IDE 抱怨特征可能没有视图边界,只有类型边界。将特征关键字更改为抽象类或将视图绑定更改为类型绑定会有所帮助。这是书上的错误吗?
让我们使用名为 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 构造函数的第二个参数。由于特征没有构造函数,因此显然不可能提供视图绑定。
为什么这在以前的版本中可能是一个谜(也许在特征内部创建了一个额外的 Function 1 值并由编译器填充?)
关于你关于Scala进化的问题,它是成熟且强大的。您可以预期主要版本(2.8、2.9、2.10)之间的变化,但我不认为 scala 对此还不够成熟。然而,总是有改进的空间
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)