【发布时间】:2017-07-29 23:59:14
【问题描述】:
我正在尝试创建一个抽象类,该类有一个方法,我想采用与某些基类相同或扩展的参数。我以为会是:
trait InputParams
abstract class A() {
def input[T <: InputParams](datum: T) // abstract
...
}
case class ExtendedInputParams() extends InputParams
class B() extends A() {
override def input[T <: InputParams](datum: T)...
// the input(datum) method needs more to be able to treat datum as an
// ExtendedInputParams, how do I do this?
...
}
在 B 类中(我怀疑 A 也需要更改)如何将 datum 类型定义为 ExtendedInputParamsfor (new B).input(some-datum-of-type-ExtendedInputParams) 以便覆盖 input 可以将 datum 视为 ExtendedInputParams 并仍然强制执行它正在扩展InputParams?我还想强制该方法覆盖类A 中的抽象方法。
为清晰起见已更新
【问题讨论】:
-
此
def input[ExtendedInputParams](datum: ExtendedInputParams)...与此def input[T](datum:T)...相同。您正在命名类型参数。将其命名为与现有类型相同的名称会造成混淆,并表明您可能不知道自己在做什么。 -
当你的类型参数名称隐藏类型名称时,有一个 linter 会发出警告,因为这种错误并非闻所未闻。
-
我当然不知道自己在做什么,所以才问这个问题。
-
在这种情况下我如何给
T一个具体的类型?我以为我将具体类型传递给input的类型参数。那我该如何声明datum的具体类型呢? -
更新问题更清晰
标签: scala scala-2.11