我最近开始学习Scala的隐式“魔法”,但是在使用Scala隐式对象时遇到了问题。我尝试了所有可能的变量,但似乎没有什么效果。
假设我有一个这样的类,其中包含一些solve()
函数。如果输入a,b为Float,则该函数应返回2个Float值。否则,它应返回另一种类型的值:
class Solver[T](val a: T, val b: T) {
def solve[A](implicit num: customNumeric[T]): Option[(T, T)] = {
Option(
num.f(num.g(a)),
num.f(num.g(b)))
}
}
让我们假设another-type-value是这样一个类的对象:
class MyClass[T] (x: T, y: T)(implicit num: customNumeric[T]) {
val field : T = num.f(x)
}
假设我没有我需要的基本Scala Numeric函数,那么我应该制作自己的自定义数值。
这是我所做的:
为我的自定义Numeric创建了一个抽象类,其中包含我的f()和g()方法,还有几个隐式对象扩展了我的customNumeric以处理一些值类型(例如Int、Float),并在它们中实现了方法:
abstract class customNumeric[T] {
def f(x: T): T
def g(x: T): T
}
object customNumeric {
implicit object IntIsCustomNumeric extends customNumeric[MyClass[Int]] {
def f(x: MyClass[Int]) = new MyClass[Int](x.field + 5)
def g(x: MyClass[Int]) = new MyClass[Int](x.field - 5)
}
implicit object FloatIsCustomNumeric extends customNumeric[Float] {
def f(x: Float): Float = x + 3
def g(x: Float): Float = x - 3
}
}
在我看来,Solver的solve()应该使用隐式的customNumeric对象来获取solve()内引用方法的实现,基于Solver输入值的类型。但是这并不起作用,因为编译器会报错:
could not find implicit value for parameter num: customNumeric[Int]
def f...
在同一行,它也因为构造函数MyClass
的参数不足而抱怨。
我已经尝试创建伴生对象将Int
转换为MyClass
:
object Fraction {
implicit def int2MyClass(x: Int): MyClass[Int] = new MyClass[Int](x, 1)
}
但是这似乎也不起作用。我尝试创建另一个隐式对象来实现我在customNumeric[MyClass[Int]]中使用的方法。
你有什么想法吗?谢谢!
Solver
将使用IntIsCustomNumeric
对象,然后通过intToMyClass
转换方法将其隐式转换为MyClass
(具有方法实现)。但是,尝试调试此转换的执行使我想知道编译器如何知道是否应将IntIsCN
转换为MyClassIsCN
,因为IntIsCN
具有完整的方法实现。因此,它可以仅使用IntIsCN
的方法执行所有操作。还有一个问题-如果f(x:Int)
不返回Int
会怎样? - Random Guy