【问题标题】:Inheriting type parameter classes in Scala在 Scala 中继承类型参数类
【发布时间】:2016-06-22 15:30:15
【问题描述】:

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

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 的新手,肯定做错了什么,但我不知道是什么

【问题讨论】:

    标签: scala


    【解决方案1】:

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

    def someFunc[A](objs: Iterable[AbstractClass[A]]) = objs.map(_.func)
    

    返回Iterable[A]

    有时您实际上可能希望允许将AbstractClasses 与不同的参数混合使用。例如。在您的示例中,您只需打印func,这总是可以完成的。在这种情况下,正如 Sascha Kolberg 的回答所说,使用通配符:

    def someFunc(objs: Iterable[AbstractClass[_]])
    

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

    【讨论】:

      【解决方案2】:

      简单的解决方案是将通配符类型作为类型参数添加到您的函数中的AbstractClass

      def someFunc(objs: Iterable[AbstractClass[_]]) = objs.foreach(obj=>println(obj.func))
      

      这样objs 可以是一个包含任何类型AbstractClass 的可迭代对象,因此本质上是一个混合类型集合。

      如果您想确定someFunc 的可迭代参数仅包含一个 AbstractClass[_] 实现的实例,您可以向 someFunc 添加另一个类型参数:

      def someFunc[A <: AbstractClass[_]](objs: Iterable[A]) = objs.foreach(obj=>println(obj.func))
      

      &lt;: 是一个类型绑定,基本上说AAbstractClass[_] 的子类

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-15
        • 2016-08-19
        • 1970-01-01
        相关资源
        最近更新 更多