我可以在scala中覆盖具有混凝土类型的类型parmeterized方法吗?

时间:2017-02-03 23:03:44

标签: scala polymorphism traits

我想通过为type-parameter指定具体类型来覆盖类型参数化方法,类似于下面的代码。

trait A {
  def amethod[T](x: T): T
}
trait B extends A {
  def amethod(x: String): String = x ++ x
}

然而,编译器提供amethod overrides nothing。我不能在[String]之后将amethod放在特征B中,因为它在语法上意味着一个名为String的类型参数而不是java.lang.String类型。我想知道是否以及如何做这样的事情。

非常感谢。

2 个答案:

答案 0 :(得分:4)

amethod,因为它在trait A中定义,是一种通用方法,这意味着每个调用都可以应用于泛型参数。

您在特质B中想要说的是改变表达一般性的范围,将其从调用站点移动到类定义本身。这是不可能的。

正如评论中所建议的那样,如果你想在类定义中表达一般性,那么type参数应该应用于类,而不是方法:

 trait A[T] {
   def amethod(x: T): T
 }

 trait B extends A[String] {
   override def amethod(x: String): String = x ++ x
 }

答案 1 :(得分:2)

作为对“B违反与A合同”的评论的解释,请考虑以下代码:

def foo(): A = new B {} // legal because B extends A
def bar = foo().amethod[Int](0)

应该怎么办?如果你想通过查看foo的主体来说它应该被拒绝,那么想象一下它是一个抽象的方法,并且某些类恰好以这种方式实现它。