2011-03-29 53 views
1

我想要做這樣的事情:我可以聲明一個裝飾器類來擴展它自己的類型參數嗎?

case class D[X <: A](arg1 : X, arg2: Int) extends X { 
} 

d是一種Arg1的一個裝飾類的,我想將它應用到幾種不同的東西,都是A.

的子類

但是我得到這個錯誤:

scala> case class D[X <: A](arg1 : X, arg2: Int) extends X { override val name = "D"; } :6: error: class type required but X found

如果沒有,有沒有更scalaish的方式做這樣的事情?

回答

1

您擴展的類必須在編譯時已知並且類型參數通常不是。因此,這是不可能的。但是,如果您試圖擴展X以受益於界面特徵A中定義的方法的實現,那麼在實例化類時可以混合使用X

new D with X 

如果您想保留的D的「case類」的功能,然後用D作爲轉發到A定義爲X類型的參數arg1方法的調用代理是一個解決方案。

trait A { 
    def foo 
} 
case class D[X <: A](arg1: X) extends A { 
    def forw = arg1 
    def foo = forw.foo 
} 
+0

啊哈,這很有道理。無論如何,特質可能對我所做的事情更有意義。謝謝! – 2011-03-29 21:58:16

相關問題