2013-06-18 93 views
1

我在尋找與下面的問題幫助向下轉換:Scala的泛型

case class A(val name: String) 
class B(name: String) extends A(name) 
class Base[T <: A](param: T) 
class SubClass[T <: B](param: T) 

object Factory { 
    def create[T <: A](param: T) = { 
    param.name match { 
     case "something" => new Base(param) 
     case "something else" => new SubClass(param) 
    } 
    } 
} 

工廠沒有因爲帕拉姆子類之間的不匹配的編譯期待(T:< B)和定義在T創建這是T:<答:是否有一個乾淨的解決方案,或者我需要在調用子類構造函數downcast?低調的樣子是怎樣的?

只要是明確的 - 當子類與PARAM池莉構建,參數是確實牛逼<的:B.

感謝。

+0

'T: senia

+0

'B類擴展A'不能編譯開始... –

+0

感謝您的意見senia和luigi。錯別字固定。它除了討論的問題之外編譯。 – user1467422

回答

1

爲什麼不先在param上匹配?

param match { 
    case b : B => ... 
    case a : A => ... 
} 
0

這編譯,如果你提供的類型參數運行正常:

case "something else" => new SubClass[T](param) 

無論應該編譯是有問題的,因爲它在運行時將給予ClassCastException如果發生這場比賽和T是不是B

更清潔的解決方案是在丹尼爾說,類型匹配。

+1

有沒有人有解釋爲什麼它typecheck? –