我想要一個可以像列表一樣使用的Queue類。在Scala中實例化類型參數類的最佳方法
比如
val q = Queue()
將實例空隊列。
爲此我使用一個同伴類的嘗試:
object Queue {
def apply() = new Queue[Any]
}
那是正確的方式做到這一點?
我想要一個可以像列表一樣使用的Queue類。在Scala中實例化類型參數類的最佳方法
比如
val q = Queue()
將實例空隊列。
爲此我使用一個同伴類的嘗試:
object Queue {
def apply() = new Queue[Any]
}
那是正確的方式做到這一點?
使用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]
對我來說沒有任何辦法q = Queue()並讓它用下面的幾行來推斷它的類型? (至於列表) –
@Sheeft這是不可能的,即使是一個列表。你可以做'val q:List [Int] = List()',或者'val q = List [Int]()',但是'val q = List()'會創建一個'List [Nothing]你以後使用。 – gourlaysama
好的謝謝。所以我使用「Any」確實是一種破解。我明白了我應該讓我的SynchronizedQueue協同工作。 –
是。
如果要在不使用new
的情況下初始化對象,那麼在同伴中使用apply()
作爲工廠方法絕對是正確的解決方法。
您可能還想考慮一個更具體的工廠(或多個工廠)來幫助您使代碼更加自我記錄。
object Queue {
def apply[T](xs: T*) = new Queue(xs: _*)
def empty[T] = new Queue[T]()
}
非常感謝。但是您的空白定義引發了兩個錯誤:_error:not found:type T_ and _error:not found:type empty_ –
嘿,是的。當我添加類型參數時,我應該將它變成「def」。現在修復 –
你能詳細說一下你的意思嗎?「可以用同樣的方式作爲列表」?只要能夠創造一個沒有'新'?還是其他一些操作? – gourlaysama
我的意思是沒有新的使用它,但我不知道我的方式是正確的。 是不是'任何'黑客? –