我想要一个可以像列表一样使用的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
我的意思是没有新的使用它,但我不知道我的方式是正确的。 是不是'任何'黑客? –