2013-09-23 78 views
3

當我需要使用演員陣容時,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類型檢查器的限制還是我缺少的東西?

+1

爲什麼不只是'def f'聲明接受'F [_]'而不是'A#T'? – stew

+0

在這種情況下,我可以,但我可能過度簡化了我想實現的目標。 – Gianlu

+0

我修改了這個問題,使其更忠實於真實的代碼。 – Gianlu

回答

2

這是類型檢查器的限制,但它是合理的。考慮你要求它證明TB <: A#T:有(我們稱之爲C)的一些子類,其中TB <: C#TC#T是具體的。存在這樣的子類(即B),但是我們是否希望編譯器搜索A的整個層次結構以找到它?