scala - 为什么在这个 Scala 代码中需要向上转换?

标签 scala scala-collections upcasting

这编译:

import scala.collection._

trait Foo[A, +This <: SortedSet[A] with SortedSetLike[A,This]]
extends SortedSetLike[A, This] { this: This =>

  def bar: This = (this: SortedSetLike[A,This]).empty

}

但是如果删除了向上转换,它就无法编译:
import scala.collection._

trait Foo[A, +This <: SortedSet[A] with SortedSetLike[A,This]]
extends SortedSetLike[A, This] { this: This =>

  def bar: This = this.empty

}

为什么?来自 extends条款我们知道FooSortedSetLike[A, This] ,所以向上转换当然是有效的 - 但这不表明编译器允许发生冲突的继承吗?

最佳答案

SortedSetLike trait 从 继承了空方法SetLike .

/** The empty set of the same type as this set
* @return  an empty set of type `This`.
*/
def empty: This

但是排序集 覆盖空方法并具有显式返回类型:
/** Needs to be overridden in subclasses. */
override def empty: SortedSet[A] = SortedSet.empty[A]

由于您指定了 的子类排序集 编译器会找到 排序集 的 empty first 的实现,它返回一个 排序集 .编译器不知道如何转换结果 排序集 给您的 子类。

但是如果你向上看 SortedSetLike trait 编译器会找到它的空方法,它返回一个 .

关于scala - 为什么在这个 Scala 代码中需要向上转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31080332/

相关文章:

斯卡拉 Akka : have actor remember something it should eventually reply to?

java - 在未知的 java.util.Map 类型上强制 Java 到 Scala 显式类型转换

c++ - 向上转换空指针是否会导致未定义的行为

java - 向上转换模板参数类型

java - Java 6 中的向下转型有多昂贵?

scala - Scala 中的延续传递风格

scala - 使嵌套 if 语句在 scala 中更实用

java - 如何在rJava中表示NA

scala - 如何在 Scala 2.8 中实现集合?

Scala的collection的sliding()在窗口大小大于step时不一致