Estoy tratando de crear una conversión implícita de cualquier tipo (por ejemplo, Int) a una cadena ...Evitar la ambigüedad definición implícita en Scala
una conversión implícita de cadena significa RichString métodos (como el inverso) no están disponibles .
implicit def intToString(i: Int) = String.valueOf(i)
100.toCharArray // => Array[Char] = Array(1, 0, 0)
100.reverse // => error: value reverse is not a member of Int
100.length // => 3
una conversión implícita a RichString significa métodos de String (como toCharArray) no están disponibles
implicit def intToRichString(i: Int) = new RichString(String.valueOf(i))
100.reverse // => "001"
100.toCharArray // => error: value toCharArray is not a member of Int
100.length // => 3
Utilizando ambas conversiones implícitas significa métodos duplicados (como longitud) son ambiguas.
implicit def intToString(i: Int) = String.valueOf(i)
implicit def intToRichString(i: Int) = new RichString(String.valueOf(i))
100.toCharArray // => Array[Char] = Array(1, 0, 0)
100.reverse // => "001"
100.length // => both method intToString in object $iw of type
// (Int)java.lang.String and method intToRichString in object
// $iw of type (Int)scala.runtime.RichString are possible
// conversion functions from Int to ?{val length: ?}
Por lo tanto, es posible convertir implícitamente a cuerdas y todavía apoyar a todos los métodos de String y RichString?
Parece que 'chuparlo' es la mejor opción. El diseño de API en Scala es significativamente más difícil que ser un consumidor de API. Quería crear un tipo de datos que ajuste un valor y permita que el usuario de API trate el tipo de datos como si fuera el tipo del valor interno. P.ej. si envuelve un Int, entonces trate el objeto como un int. Resulta que esto es muy difícil. estoy considerando dar mis tipos de datos métodos auxiliares: tipo T val internedValue: T def s = internedValue.asInstanceOf [String] def i = internedValue.asInstanceOf [Int] etc ... – Synesso
Prefiero '(100: String) .length', ya que es seguro, mientras que 'asInstanceOf' no lo es. Además, es más bonita y más corta. –
No solo eso, sino queInstanceOf nunca funcionará aquí, ya que solo lo hace downcasting (que está destinado a fallar aquí) y no iniciará ninguna conversión implícita. En otras palabras, '100.asInstanceOf [String] .length' siempre fallará con' ClassCastException' –