gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:45:10 26 4
gpt4 key购买 nike

在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com