如何使用泛型扩展抽象类?

时间:2015-04-03 06:59:23

标签: scala generics abstract

我是Scala的新手。我想要做的是创建一个名为EnhancedFirstOrderMinimizer的抽象类,它扩展另一个名为FirstOrderMinimizer的抽象类。但是,IDE告诉我" Type mismatch, expected: nothing, actual: DF"。

这是FirstOrderMinimizer:

abstract class FirstOrderMinimizer[T, DF <: StochasticDiffFunction[T]]
    (maxIter: Int = -1, tolerance: Double = 1E-6, improvementTol: Double = 1E-3,
     val minImprovementWindow: Int = 10,
     val numberOfImprovementFailures: Int = 1)
    (implicit space: NormedModule[T, Double])
    extends Minimizer[T, DF] with SerializableLogging {

protected def initialHistory(f: DF, init: T): History
  ...
  type History
  protected def initialHistory(f: DF, init: T): History
  protected def adjustFunction(f: DF): DF = f
  protected def adjust(newX: T, newGrad: T, newVal: Double): (Double, T) =
    (newVal, newGrad)
  protected def chooseDescentDirection(state: State, f: DF): T
  protected def determineStepSize(state: State, f: DF, direction: T): Double
  protected def takeStep(state: State, dir: T, stepSize:Double): T
  protected def updateHistory(newX: T, newGrad: T, newVal: Double,
                              f: DF, oldState: State): History

  def iterations(f: DF, init: T): Iterator[State] = {
    val adjustedFun = adjustFunction(f)
    infiniteIterations(f, initialState(adjustedFun, init))
      .takeUpToWhere(_.converged) 
  }
  ...
}

以下是EnhancedFirstOrderMinimizer

EnhancedFirstOrderMinimizer[T, DF<:StochasticDiffFunction[T]]
    (maxIter: Int = -1, tolerance: Double=1E-6, improvementTol: Double=1E-3)
    extends FirstOrderMinimizer {

  override def iterations(f: DF, init: T): Iterator[State] = {
    val adjustedFun = adjustFunction(f)

    // f: Type mismatch, expected: nothing, actual: DF
    infiniteIterations(f, initialState(adjustedFun, init))
      .takeUpToWhere(_.converged)
  }
}

你能帮我看一下吗?

1 个答案:

答案 0 :(得分:3)

编译器告诉您f的第一个参数infiniteIterations是错误的类型。我们可能需要查看声明infiniteIterations的位置,以确切知道发生了什么。

但我认为对您的扩展程序问题的快速回答是extends FirstOrderMinimizer应更改为extends FirstOrderMinimizer[T, DF]