Próbuję utworzyć niejawna konwersja z dowolnego typu (powiedzmy, int) na ciąg ...Unikanie niejawny def niejasności w Scala
niejawna konwersja do String oznacza RichString metody (takie jak odwrocie) nie są dostępne .
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
Pośrednia konwersja do RichString oznacza metody łańcuchowe (np toCharArray) nie są dostępne
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
obiema ukryte konwersji oznacza metodę podwajania (np długości) są niejednoznaczne.
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: ?}
Czy możliwe jest niejawne przekonwertowanie na ciąg i nadal obsługuje wszystkie metody String i RichString?
Wygląda na to, że "ssać to" jest najlepszą opcją. Projektowanie interfejsu API w Scali jest znacznie trudniejsze niż bycie konsumentem API. Chciałem stworzyć typ danych, który zawija wartość i pozwala użytkownikowi API traktować ten typ danych tak, jakby był typem internowanej wartości. Na przykład. jeśli opakuje Int, traktuj obiekt jak int. Okazuje się, że to zbyt trudne. Zastanawiam dając moje dataType metody pomocnika: typ T val internedValue: T def s = internedValue.asInstanceOf [String] def i = internedValue.asInstanceOf [Int] ... itd – Synesso
Wolę (' 100: String) .length', ponieważ jest to bezpieczne, podczas gdy 'asInstanceOf' nie jest. Poza tym jest ładniejsza i krótsza. –
Nie tylko to, ale asInstanceOf nigdy tu nie będzie działało, ponieważ zdarza się tylko downcasting (co tutaj kończy się niepowodzeniem) i nie rozpocznie żadnej niejawnej konwersji. Innymi słowy, '100.asInstanceOf [String] .length' zawsze zawiedzie z' ClassCastException' –