2014-02-08 121 views
0

我想要一個可以像列表一樣使用的Queue類。在Scala中實例化類型參數類的最佳方法

比如

val q = Queue() 

將實例空隊列。

爲此我使用一個同伴類的嘗試:

object Queue { 
    def apply() = new Queue[Any] 
} 

那是正確的方式做到這一點?

+0

你能詳細說一下你的意思嗎?「可以用同樣的方式作爲列表」?只要能夠創造一個沒有'新'?還是其他一些操作? – gourlaysama

+0

我的意思是沒有新的使用它,但我不知道我的方式是正確的。 是不是'任何'黑客? –

回答

6

使用Companion對象的apply方法是做正確的方式,但你也可以添加在apply本身的類型參數:

object Queue { 
    def apply[T]() = new Queue[T] 
} 

這樣就可以創建正確類型的Queue

val q = Queue[Int]() 

通常也允許填充在創建序列,從而使元素類型可以推斷,如:

def apply[T](elms: T*) = ??? 

所以,你可以這樣做:

val q = Queue(1,2,3) // q is a Queue[Int] 
+0

對我來說沒有任何辦法q = Queue()並讓它用下面的幾行來推斷它的類型? (至於列表) –

+1

@Sheeft這是不可能的,即使是一個列表。你可以做'val q:List [Int] = List()',或者'val q = List [Int]()',但是'val q = List()'會創建一個'List [Nothing]你以後使用。 – gourlaysama

+0

好的謝謝。所以我使用「Any」確實是一種破解。我明白了我應該讓我的SynchronizedQueue協同工作。 –

3

是。

如果要在不使用new的情況下初始化對象,那麼在同伴中使用apply()作爲工廠方法絕對是正確的解決方法。

您可能還想考慮一個更具體的工廠(或多個工廠)來幫助您使代碼更加自我記錄。

object Queue { 
    def apply[T](xs: T*) = new Queue(xs: _*) 
    def empty[T] = new Queue[T]() 
} 
+0

非常感謝。但是您的空白定義引發了兩個錯誤:_error:not found:type T_ and _error:not found:type empty_ –

+0

嘿,是的。當我添加類型參數時,我應該將它變成「def」。現在修復 –