如何使用泛型扩展抽象 class?
How to extends an abstract class with generics?
我是 Scala 新手。我想要做的是创建一个名为 EnhancedFirstOrderMinimizer
的抽象 class,它扩展了另一个名为 FirstOrderMinimizer
的抽象 class。但是,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)
}
}
能帮我看看吗?
编译器告诉您 f
是 infiniteIterations
的第一个参数的错误类型。我们可能需要查看声明 infiniteIterations
的位置,才能准确了解发生了什么。
但我认为您的扩展问题的快速答案是 extends FirstOrderMinimizer
应该更改为 extends FirstOrderMinimizer[T, DF]
。
我是 Scala 新手。我想要做的是创建一个名为 EnhancedFirstOrderMinimizer
的抽象 class,它扩展了另一个名为 FirstOrderMinimizer
的抽象 class。但是,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)
}
}
能帮我看看吗?
编译器告诉您 f
是 infiniteIterations
的第一个参数的错误类型。我们可能需要查看声明 infiniteIterations
的位置,才能准确了解发生了什么。
但我认为您的扩展问题的快速答案是 extends FirstOrderMinimizer
应该更改为 extends FirstOrderMinimizer[T, DF]
。