我应该创建具有2种不同实现的类Example[T]
:
T
可以转换为Numeric
我尝试使用隐式转换
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()
现在我无法编译我的代码。
答案 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() = ...
}