Scala:自我类型与Int不符合父类型

时间:2014-04-11 11:12:22

标签: scala generics self-type

我指的是通用数字编程帖子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等)的通用方法。

1 个答案:

答案 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