當我需要使用演員陣容時,Scala中有些情況,儘管我會說這不是必須的。考慮下面的程序:在意想不到的地方需要casts
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類型檢查器的限制還是我缺少的東西?
爲什麼不只是'def f'聲明接受'F [_]'而不是'A#T'? – stew
在這種情況下,我可以,但我可能過度簡化了我想實現的目標。 – Gianlu
我修改了這個問題,使其更忠實於真實的代碼。 – Gianlu