我指的是通用数字编程帖子here。但是我在使用此代码时出现编译错误:
object V1 {
trait Addable[A] {
self: A =>
def +(that: A): A
}
def add[A <: Addable[A]](x: A, y: A): A = x + y
implicit class MyInt(x: Int) extends Addable[Int] {
y: Int =>
override def +(y: Int): Int = x + y
}
def main(args: Array[String]) = {
add(1, 2)
}
}
错误如下所示:
V1.scala:9: error: `implicit' modifier can be used only for values, variables and methods
implicit class MyInt(x: Int) extends Addable[Int] {
^
V1.scala:15: error: inferred type arguments [Int] do not conform to method add's type parameter bounds [A <: V1.Addable[A]]
add(1, 2)
^
two errors found
如何修复自我类型?
编辑:更新了代码和错误。
基本上,我想创建一个可以添加两个数字(Int,Double等)的通用方法。
答案 0 :(得分:2)
self: A =>
表示实际实现此特征的任何类都必须扩展A
。错误消息class MyInt cannot be instantiated because it does not conform to its self-type V1.MyInt with Int
(来自评论)基本上表示MyInt
不会延伸Int
。由于没有类可以扩展Int
,因此Addable[Int]
无法实现。
消息inferred type arguments [Int] do not conform to method add's type parameter bounds [A <: V1.Addable[A]]
表示Int
不是Addable[Int]
的子类型。
如何修复自我类型?
这种方法只是不能与Int
一起使用。标准方法使用the type class pattern。
基本上,我想创建一个可以添加两个数字(Int,Double等)的通用方法。
标准库中已经存在类型类Numeric[T]
:
def add[A](x: A, y: A)(implicit n: Numeric[A]) = n.plus(x, y) // or simply x + y