32

据我了解,隐式转换可能导致代码难以理解,或者代码存在其他问题(甚至可能是错误?),这就是为什么它们需要显式启用才能在代码中使用而不会收到警告。

然而,考虑到隐式转换在很大程度上(如果不是大部分时间)用于用另一种类型的对象包装一个对象,隐式类也是如此——如果我错了,我会很感激你纠正我——,为什么前者需要进口,scala.language.implicitConversions而后者不需要?

object Main extends App {
  implicit class StringFoo(x: String) {
    def fooWithImplicitClass(): Unit =
      println("foo with implicit class")
  }
  // => silence.

  "asd".fooWithImplicitClass()

  /************************/

  class Foo(x: String) {
    def fooWithImplicitDef(): Unit =
      println("foo with implicit def")
  }
  implicit def string2Foo(x: String) = new Foo(x)
  // => warning: implicit conversion method string2Foo should be enabled

  "asd".fooWithImplicitDef()
}
4

2 回答 2

21

隐式类仅有效地添加新方法(或特征),并且仅在调用这些添加的方法时才使用它们(或显式使用隐式类,但这在实践中很少发生)。另一方面,可以调用对现有类型的隐式转换,而程序员的可见性较低。

于 2013-09-20T11:19:46.003 回答
0

IMO,就可能引起的混淆而言,隐式类和隐式转换之间没有根本区别,因此应该警告两者。

但是通过将一个类定义为隐式,就像通过告诉编译器“我是一个成年人,我知道我在做什么”来明确抑制警告一样。这个类打算以这种方式使用(可能作为扩展包装器) 。” 因此,不会发出警告,因为作为类的创建者,您已经明确表示,隐式使用是该类应该如何工作或允许使用该类的方式,编译器当然应该信任您。

另一方面,您可以使用隐式转换将对象转换为任何类,无论目标类是否打算被隐式使用。这是许多麻烦的根源,也是 Scala 试图阻止的。

于 2016-09-14T08:43:18.490 回答