【问题标题】:Scala implicits for specializationScala 隐含的专业化
【发布时间】:2018-09-08 18:54:02
【问题描述】:

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

  1. 如果T可以转换为Numeric
  2. 另一种情况

我尝试通过隐式转换来做到这一点

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()

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

【问题讨论】:

  • 你能用一些示例代码展示你期望发生的事情以及实际发生的事情吗?因为我不是很关注。
  • @Jasper-M 谢谢你的回答,我已经用预期的结果更新了问题

标签: scala


【解决方案1】:

只需创建一个隐式类,在类型参数为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

【讨论】:

    【解决方案2】:

    我测试了这段代码。而且似乎代码按预期工作。这里对象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
    

    【讨论】:

      【解决方案3】:

      安德烈答案的替代方案:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-05
        • 1970-01-01
        • 2020-07-18
        相关资源
        最近更新 更多