2014-02-08 94 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”。现在修复 –