scala - 在意想不到的地方需要类型转换

标签 scala types

在 Scala 中有些情况下我需要使用强制转换,尽管我认为这并不是严格要求的。考虑以下程序:

abstract class A {
  type T <: F[T]
}

abstract class F[T <: F[T]] {
  def me: String
}

class B extends A {
  type T = TB
}

class TB extends F[TB] {
  def me = "It's me"
  def you = "It's you"
}

trait Operator[S <: A] extends Function[S#T,String]

object f1 extends Operator[A] {
  def apply(x: A#T) = x.me
}

object f2 extends Operator[B] {
  def apply(x: B#T) = x.you
}

object Driver {
  def main(args: Array[String]) {
    val bi = new TB()
    println(f1(bi.asInstanceOf[A#T]))
    println(f2(bi))
  }
}

如果我在 main 方法中删除 asInstanceOf[A#T],则代码不会编译。但是,我认为类型转换真的没有必要。实际上,用javap查看生成的字节码,并没有出现checkcast指令。这是 Scala 类型检查器的限制还是我遗漏了什么?

最佳答案

这是类型检查器的一个限制,但它是一个合理的限制。考虑一下您要求它证明什么 TB <: A#T : 有一些子类 A (我们称之为 C )其中 TB <: C#TC#T是具体的。这样的子类存在(即 B ),但我们一定要编译器搜索 A 吗?整个层次结构都能找到吗?

关于scala - 在意想不到的地方需要类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18967465/

相关文章:

scala - 使用 Tachyon 测试 Spark

types - 整数向量不是数字数组的子类型,为什么?

java - Double 数据类型的意外行为

java - Java是否允许类型参数为类型参数?

php - MySQL数据类型的用途

javascript - TypeScript 有 NaN 类型吗?

c# - 如何将List <Object>转换为继承类的数组?

arrays - scala 中的多维数组 zip 数组

list - 无法推断参数类型

scala - Scala 中的多键映射