将泛型类型推导/转换为具体类型

时间:2015-01-30 22:34:23

标签: scala type-erasure

当我尝试编译时:

package com

object typeparam extends App {

  new MyClass[Int]().f2(3)

  class MyClass[B] {

    def f2(b: B): B = {
      b + b
    }

  }

}

我收到编译错误

type mismatch;
[error]  found   : B
[error]  required: String
[error]       b + b
[error]           ^
[error] one error found

为什么不将b推断为Int,因为当我调用类时我使用类型参数Int?

如果我改为使用:

package com

object typeparam extends App {

  println(new MyClass[Int]().f2(3) * 3)

  class MyClass[B] {

    def f2(b: B): B = {
      b
    }

  }

}

正确打印值9。所以似乎正确推断出Int类型。

这与类型擦除有关吗?

1 个答案:

答案 0 :(得分:3)

它与类型擦除没有任何关系。您的类型参数B是无限制的,并非每种类型都有+方法。但是,每种类型都可以隐式转换为String,以便使用+方法(推断为Any),而这正是这里发生的事情。< / p>

如果您希望仅使用数字,可能需要Numeric特征?

class MyClass[B](implicit num: Numeric[B]) {
   def f2(b: B): B = num.plus(b, b)
}

scala> def myInst = new MyClass[Int]
myInst: MyClass[Int]

scala> myInst.f2(3)
res0: Int = 6