2015-04-03 3 views
1

Я новичок в 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) 
    } 
} 

Не могли бы вы помочь мне проверить это?

ответ

3

Компилятор сообщает вам, что f является неправильным типом для первого аргумента infiniteIterations. Вероятно, нам нужно увидеть, где объявлено, что именно infiniteIterations точно знает, что происходит.

Но я думаю, что быстрый ответ на вашу проблему расширения заключается в том, что extends FirstOrderMinimizer следует изменить на extends FirstOrderMinimizer[T, DF].

+0

Да, сейчас он работает. спасибо ~ – Mark

Смежные вопросы