Scala 无法重写特征的抽象方法

Scala 无法重写特征的抽象方法,scala,Scala,我有一个未实现方法的特性(该特性来自第三方库,因此我无法更改) 我试图扩展它并在其中实现方法B(尝试了三种方法),但我得到了以下错误。我的主要要求是,我希望将T的B实现为Int(即B[Int]并返回B*2) scala>C类扩展了{ |def B(B:Int):Int=B*2 | } :12:错误:类C需要是抽象的,因为没有定义[T](B:T)T类型的特性A中的方法B C类扩展了{ ^ scala>C类扩展了{ |def B[T](B:T):T=B*2//我知道这为什么不起作用,但我如何实现B[

我有一个未实现方法的特性(该特性来自第三方库,因此我无法更改)

我试图扩展它并在其中实现方法
B
(尝试了三种方法),但我得到了以下错误。我的主要要求是,我希望将
T
B
实现为
Int
(即
B[Int]
并返回
B*2

scala>C类扩展了{
|def B(B:Int):Int=B*2
| }
:12:错误:类C需要是抽象的,因为没有定义[T](B:T)T类型的特性A中的方法B
C类扩展了{
^
scala>C类扩展了{
|def B[T](B:T):T=B*2//我知道这为什么不起作用,但我如何实现B[Int]
| }
:13:错误:值*不是类型参数T的成员
定义B[T](B:T):T=B*2
^
scala>C类扩展了{
|覆盖def B(B:Int):Int=B*2
| }
:12:错误:类C需要是抽象的,因为没有定义[T](B:T)T类型的特性A中的方法B
C类扩展了{
^
:13:错误:方法B不覆盖任何内容。
注:C类的超类包含以下名为B的非最终成员:
定义B[T](B:T):T
覆盖def B(B:Int):Int=B*2
^
斯卡拉>

原始方法应该适用于任意输入类型
T
。如果要实现/覆盖它,还必须支持所有可能的输入类型

因此,如果你不能支持这种特质,最好不要继承它

如果必须这样做,唯一的方法就是这样做:

case class C() extends A {
  override def B[T](b: T): T = {
    val res = b.asInstanceOf[Int] * 2
    res.asInstanceOf[T]
  }
}

祈祷只提供int值作为输入。

为了创建扩展a的具体类,您需要为a中的所有抽象方法提供实现。因此,在这种情况下,您需要为

def B[T](b: T):T
由于
B
是一个通用函数,因此您需要提供
B
的通用实现以及您对
Int
的专业知识

def B[T](b: T): T = b
def B(b: Int): Int = b*2
编译器将对
Int
值使用
B
的专用版本,对所有其他值使用通用版本

警告 先前的答案表明

override def B[Int](b: Int): Int = b
但是在这种情况下,
Int
是一个类型参数,而不是
Int
数据类型,因此这是一个通用函数,与

override def B[T](b: T): T = b

这提供了
B
的具体实现,即
identity
函数。这可能是您想要的,也可能不是您想要的…

谢谢。它成功了。
scala>类C扩展了a{def B[T](B:T):T=B|def B(B:Int):Int=B*2}定义的类C scala>new C().B(2)res2:Int=4 scala>new C().B(“f”)res3:String=f
我想知道,虽然我必须同时提供这两种实现,但这不是很不方便和令人困惑吗。这背后的动机是什么?如果我想让我的代码只为
Int
工作,并说
Float
,那么我只提供这两种实现不是更好吗?如果我尝试使用它,编译器会给出错误me other data type?@ManuChadha特性
A
被定义为对所有数据类型支持方法
B
,您不能覆盖它,因为
A
的其他用户会期望它。编译器不能在编译时执行您描述的检查,而在运行时执行该检查会删除一些类型安全性,以便更好地使程序运行如果需要,请检查。谢谢Simpadjo。我尝试过这个,但是我没有返回
res.asInstanceOf[t]
。因此代码没有编译。现在我也知道如何用这种方式解决问题。
override def B[Int](b: Int): Int = b
override def B[T](b: T): T = b