【发布时间】:2016-11-18 16:42:35
【问题描述】:
我编写了以下非常简单的程序,我希望它可以正常工作:
object Main {
def main(args: Array[String]) = {
val mc1: MyClass = new MyClass(20);
val mc2: MyClass = 10
mc1.doSome //fine
mc2.doSome //fine
30.doSome //error. Cannot resolve symbol doSome
}
implicit def int2MyClass(i: Int): MyClass = new MyClass(i)
implicit class Tst(val mc: MyClass){
def doSome = println(mc.i)
}
}
class MyClass(val i: Int)
但不幸的是,它没有。该错误是由于隐式转换未能将30 转换为MyClass(30) 引起的。为什么?这有什么问题?
【问题讨论】:
-
在使用前声明隐式,如果在同一个文件中
-
仅供参考,它通过将
30.doSome更改为(30: MyClass).doSome进行编译。我不知道为什么!除非您明确指定类型,否则编译器似乎只应用一次隐式。 -
正如@IdanWaisman 所指出的,Scala 不允许堆叠/链接隐式。从设计上讲,它是一种一次性的机制。
标签: scala implicit-conversion implicit