Scala暗示专业化

时间:2018-03-29 17:58:36

标签: scala

我应该创建具有2种不同实现的类Example[T]

  1. 如果T可以转换为Numeric
  2. 另一个案例
  3. 我尝试使用隐式转换

    class ExampleImplicits{
      implicit def convert[T](example: Example[T]): ExampleSecond[T] = new ExampleSecond[T]()
    }
    
    class Example[T:Numeric]...
    class ExampleSecond[T]...
    

    我认为如果编译器在scala.Numeric.Implicit中找不到T的隐式转换,那么他将提升我的隐式转换。

    但是当我测试代码时,这不是这样的。我该怎么做这个专业化?

    更新

    我想得到什么:

    val x = new Example[Int]()
    x.methodThatHaveOnlyNumerics()
    x.methodThatHaveAllImplementations()
    val y = new Example[String]()
    y.methodThatHaveAllImplementations()
    

    现在我无法编译我的代码。

3 个答案:

答案 0 :(得分:2)

只需创建一个隐式类,在类型参数为Numeric的情况下提供其他方法:

class Example[X] {
  def methodThatHaveAllImplementations(): Unit = println("all")
}

implicit class ExampleNumOps[N: Numeric](ex: Example[N]) {
  def methodThatHaveOnlyNumerics(): Unit = println("num")
}

val x = new Example[Int]()
x.methodThatHaveOnlyNumerics()
x.methodThatHaveAllImplementations()
val y = new Example[String]()
y.methodThatHaveAllImplementations()

输出:

num
all
all

答案 1 :(得分:0)

我测试了这段代码。似乎代码按预期工作。对象ob返回ExampleSecond[Int]。我用下面的代码测试过。

我希望这是你所期待的。

object HelloWorld {
    def main(args: Array[String]): Unit = {
        val ex = new Example[Int]
        val x = new ExampleImplicits
        val ob = x.convert(ex) // passing Example[Int] object to convert
        println(ob.isInstanceOf[ExampleSecond[Int]]) // returns true because it is of ExaampleSecond[Int] object.
    }

}
class ExampleImplicits {
    implicit def convert[T](example: Example[T]): ExampleSecond[T] = new ExampleSecond[T]()
}

class Example[T: Numeric] {
    println("ex")
}
class ExampleSecond[T] {
    println("ex2")
}

Output :
ex
ex2
true

答案 2 :(得分:0)

安德烈回答的另一种选择:

class Example[T] {
  def methodThatHaveOnlyNumerics()(implicit num: Numeric[T]) = ...

  def methodThatHaveAllImplementations() = ...
}