在Scala中继承类型参数类

时间:2016-06-22 07:19:02

标签: scala

我有一个带有类型参数的抽象类,很少有它的实现:

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的新手并且肯定做错了什么,但我无法弄清楚是什么

2 个答案:

答案 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))

<:是一种类型绑定,基本上表示AAbstractClass[_]

的子类