我可以在 Scala 中使用具体类型覆盖类型参数化方法吗?
Can I override a type parmeterized method with concrete type in scala?
我想通过为类型参数分配具体类型来覆盖类型参数化方法,类似于下面的代码。
trait A {
def amethod[T](x: T): T
}
trait B extends A {
def amethod(x: String): String = x ++ x
}
但是编译器给出 amethod overrides nothing
。我不能在特征 B 中的 amethod
之后放置 [String]
,因为在句法上它意味着一个名为 String 的类型参数,而不是类型 java.lang.String。我想知道我是否以及如何做这样的事情。
非常感谢。
amethod
,因为它在特征 A
中定义,是一个泛型方法,这意味着每个调用都可以应用于泛型参数。
你在 trait B
中想说的是改变表达普遍性的范围,将其从调用站点移动到 class 定义本身。做不到。
正如评论中所建议的那样,如果您想在 class 定义中表达通用性,类型参数应应用于 class,而不是方法:
trait A[T] {
def amethod(x: T): T
}
trait B extends A[String] {
override def amethod(x: String): String = x ++ x
}
作为对“B
违反与 A
的合同”的评论的解释,请考虑以下代码:
def foo(): A = new B {} // legal because B extends A
def bar = foo().amethod[Int](0)
应该怎么办?如果你想说它应该通过查看 foo
的主体来拒绝,请想象它是一个抽象方法,而某些 class 恰好以这种方式实现它。
我想通过为类型参数分配具体类型来覆盖类型参数化方法,类似于下面的代码。
trait A {
def amethod[T](x: T): T
}
trait B extends A {
def amethod(x: String): String = x ++ x
}
但是编译器给出 amethod overrides nothing
。我不能在特征 B 中的 amethod
之后放置 [String]
,因为在句法上它意味着一个名为 String 的类型参数,而不是类型 java.lang.String。我想知道我是否以及如何做这样的事情。
非常感谢。
amethod
,因为它在特征 A
中定义,是一个泛型方法,这意味着每个调用都可以应用于泛型参数。
你在 trait B
中想说的是改变表达普遍性的范围,将其从调用站点移动到 class 定义本身。做不到。
正如评论中所建议的那样,如果您想在 class 定义中表达通用性,类型参数应应用于 class,而不是方法:
trait A[T] {
def amethod(x: T): T
}
trait B extends A[String] {
override def amethod(x: String): String = x ++ x
}
作为对“B
违反与 A
的合同”的评论的解释,请考虑以下代码:
def foo(): A = new B {} // legal because B extends A
def bar = foo().amethod[Int](0)
应该怎么办?如果你想说它应该通过查看 foo
的主体来拒绝,请想象它是一个抽象方法,而某些 class 恰好以这种方式实现它。