【问题标题】:Scala by Example - trait type parameter with context bounds mistake?Scala 示例 - 具有上下文边界错误的特征类型参数?
【发布时间】:2013-03-16 21:58:01
【问题描述】:

Reading the Scala by Example book,当 Martin 在第 54 页解释类型边界时,有这个例子:

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

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

在第 55 页进一步。他还说

是 trait Set 所需的唯一更改,以展示类型边界的可能性。

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

【问题讨论】:

  • 在编写“Scala by Example”之后,规范发生了变化。见this discussion
  • 感谢您的指出!但是我认为实现的复杂性影响语言是不好的。没有逻辑解释为什么特征可能没有上限。
  • 特征可以有上限。它们不能有上下文和视图边界,因为它们是构造函数参数,而特征不能有构造函数参数。
  • 谢谢你,Daniel,是的,这些结构似乎只是语法糖,解释在于真正的底层语言语法。但是,我现在很好奇,您能否解释一下或指出一个来源,该来源解释说,以前怎么支持此功能?在 Scala 成熟之前,还计划/可能进行多少这样的更改?
  • @noncom:就其价值而言,我倾向于同意。但是,如果唯一的解决方案(根据我链接的线程)涉及编译器神奇地向所有实现该特征的类添加构造函数,那么当进一步继承发生时,我会警惕微妙的极端情况(类似于过去发生的情况)类继承)。

标签: scala view traits


【解决方案1】:

让我们使用名为 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 构造函数的第二个参数。由于 trait 没有构造函数,显然不可能提供视图绑定。

为什么这在以前的版本中是可能的,这对我来说是个谜(也许在 trait 内部创建了一个额外的 Function1 val 并由编译器填充?)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 2016-07-17
    相关资源
    最近更新 更多