我有一个带有类型参数的抽象类,很少有它的实现:
abstract class AbstractClass[T] {
def func: T
}
class DoubleClass extends AbstractClass[Double]{
def func = 0.0
}
然后我想创建一个需要一些这样的对象序列的函数:
def someFunc(objs: Iterable[AbstractClass]) = objs.foreach(obj=>println(obj.func))
但它说“Class AbstractClass采用类型参数”
我是scala的新手并且肯定做错了什么,但我无法弄清楚是什么
答案 0 :(得分:5)
在大多数情况下应该是def someFunc[A](objs: Iterable[AbstractClass[A]])
。特别是,这允许返回类型取决于A
,例如
def someFunc[A](objs: Iterable[AbstractClass[A]]) = objs.map(_.func)
返回Iterable[A]
。
有时您可能希望允许将AbstractClass
与不同参数混合使用。例如。在您的示例中,您只需打印func
,这始终可以完成。在这种情况下,正如Sascha Kolberg的回答所说,使用通配符:
def someFunc(objs: Iterable[AbstractClass[_]])
但如果您发现自己经常使用通配符,请考虑重新考虑您的设计。
答案 1 :(得分:3)
简单的解决方案是在您的函数中将通配符类型作为类型参数添加到AbstractClass
:
def someFunc(objs: Iterable[AbstractClass[_]]) = objs.foreach(obj=>println(obj.func))
这种方式objs
可以是包含任何类型AbstractClass
的迭代,因此基本上是一个混合类型集合。
如果你想确定someFunc
的iterable参数只包含AbstractClass [_]的一个实现的实例,你可以在someFunc中添加另一个类型参数:
def someFunc[A <: AbstractClass[_]](objs: Iterable[A]) = objs.foreach(obj=>println(obj.func))
<:
是一种类型绑定,基本上表示A
是AbstractClass[_]