scala:操作过载和隐式转换澄清

时间:2016-03-15 16:23:41

标签: scala

这是一个代码示例。不知道为什么我在使用乘法时会出错。 我应该向Int添加隐式转换吗?当然答案很简单!! 感谢

    class Fraction(val x:Int, val y:Int)    
    {               
        def X = x
        def Y = y

        implicit def int2Fraction(n: Int) = Fraction(n, 1)
        def *(that: Fraction) : Fraction = new Fraction(that.X * X, that.Y * Y)
    }

    object Fraction {
        def apply(x: Int, y: Int) = new Fraction(x, y)
    }

    val x : Int = 3 
    val result = x * Fraction(4, 5)
    println( result.X )

enter image description here

2 个答案:

答案 0 :(得分:4)

您的隐式转换函数是Fraction类的成员 - 因此无法在没有Fraction的实例的情况下调用它。如果将其移至object,它将按预期工作:

object Fraction {
    def apply(x: Int, y: Int) = new Fraction(x, y)
    implicit def int2Fraction(n: Int) = Fraction(n, 1)
}

答案 1 :(得分:2)

要进行隐式转换,它必须在范围内。尝试在课外学习:

implicit def int2Fraction(n: Int) = Fraction(n, 1)

class Fraction(val x:Int, val y:Int)
{
    def X = x
    def Y = y


    def *(that: Fraction) : Fraction = new Fraction(that.X * X, that.Y * Y)
}

object Fraction {
    def apply(x: Int, y: Int) = new Fraction(x, y)
}

你也可以把它放在伴侣对象里面;编译器会自动搜索。