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