在Scala中继承类型参数类

Aza*_*nov 1 scala

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

abstract class AbstractClass[T] {
    def func: T
}

class DoubleClass extends AbstractClass[Double]{
    def func = 0.0
}
Run Code Online (Sandbox Code Playgroud)

然后我想创建一个需要一些这样的对象序列的函数:

def someFunc(objs: Iterable[AbstractClass]) = objs.foreach(obj=>println(obj.func))
Run Code Online (Sandbox Code Playgroud)

但它说"Class AbstractClass采用类型参数"

我是斯卡拉的新手,肯定做错了什么,但我不知道是什么

Ale*_*nov 5

在大多数情况下应该是def someFunc[A](objs: Iterable[AbstractClass[A]]).特别是,这允许返回类型依赖于A例如

def someFunc[A](objs: Iterable[AbstractClass[A]]) = objs.map(_.func)
Run Code Online (Sandbox Code Playgroud)

回报Iterable[A].

有时您可能希望允许混合AbstractClass使用不同的参数.例如,在您的示例中,您只需打印func即可完成.在这种情况下,正如Sascha Kolberg的回答所说,使用通配符:

def someFunc(objs: Iterable[AbstractClass[_]])
Run Code Online (Sandbox Code Playgroud)

但如果您发现自己经常使用通配符,请考虑重新考虑您的设计.