是否可以针对给定对象执行隐式自定义转换为Unit
?
我的意思是定义如下转换:
implicit def toUnit(m: MyClass): Unit = println("Hello")
使用如下:
val x: MyClass = new MyClass() // no conversions
val y: Unit = new MyClass() // 1
new MyClass() // 2
我已经为上面的其他对象定义了一些转换:Unit
是唯一无效的类。
我认为它应该可行,至少在 1 的情况下,但我看不到控制台上打印Hello
。为什么?
答案 0 :(得分:4)
这不起作用,因为Unit
由编译器专门处理。由于价值丢弃,您可以将MyClass
分配给Unit
。没有任何牵连。
来自scala spec:
如果e具有某种值类型且预期类型为Unit,则通过将e嵌入到术语{e;中来将e转换为期望类型。 ()}。
所以这里发生的是编译器将new MyClass()
更改为
{ new MyClass(); () }