2015-04-03 130 views
1

我是斯卡拉新手。我想要做的是创建一个名为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) 
    } 
} 

能否请你帮我检查一下吗?

回答

3

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

但我认为你的扩展问题的快速答案是extends FirstOrderMinimizer应改为extends FirstOrderMinimizer[T, DF]

+0

是的,它现在有效。谢谢〜 – Mark 2015-04-03 07:58:37