scala - ¿Por qué implícita las conversiones se requieren para las definiciones implícitas pero no para las clases?
type-conversion implicit-conversion (2)
Las clases implícitas efectivamente solo agregan nuevos métodos (o rasgos), y solo se usan cuando se llaman a estos métodos agregados (o la clase implícita se usa explícitamente, pero esto rara vez sucede en la práctica). Las conversiones implícitas a tipos existentes, por otro lado, pueden invocarse con menos visibilidad para el programador.
Por lo que yo entiendo, las conversiones implícitas pueden resultar en un código potencialmente difícil de entender, o en un código que sufra otros problemas (¿quizás incluso errores?), Por lo que requieren una habilitación explícita para poder usarlos en el código sin recibir advertencias.
Sin embargo, dado que las conversiones implícitas se utilizan en gran parte (si no es la mayoría del tiempo) para envolver un objeto con un objeto de otro tipo, y también lo son las clases implícitas, le agradecería que me corrigiera si me equivoco. ¿por qué los primeros requieren la importación de scala.language.implicitConversions
pero estos últimos no?
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()
}
OMI, no existe una diferencia fundamental entre una clase implícita y una conversión implícita en lo que respecta a la confusión en la que podrían incurrir, por lo que ambos deberían haber sido advertidos.
Pero al definir una clase como implícita, es como suprimir explícitamente la advertencia al decirle al compilador que "soy un adulto, sé lo que estoy haciendo. ESTA CLASE ESTÁ DISEÑADA PARA SER USADA DE ESTA MANERA (posiblemente como una envoltura de extensión) " Por lo tanto, no se darán advertencias dado que usted, como creador de la clase, ha dejado en claro que al usar implícitamente cómo se supone que debe funcionar esta clase o cómo se permite usar la clase, el compilador ciertamente debe confiar en usted.
Puede, por otro lado, convertir un objeto a cualquier clase mediante el uso de la conversión implícita, sin importar si la clase objetivo está destinada a ser utilizada implícitamente. Esta es la fuente de muchos problemas, y también lo que Scala está tratando de prevenir.