Gnome обеспечивает превосходную библиотеку для этого, названного Бойкий , со многими полезными структурами данных и другими утилитами также.
Я считаю, что более «явный» способ выполнения неявных преобразований намного лучше с точки зрения удобочитаемости, чем полностью прозрачный, по крайней мере, в этом примере.
На мой взгляд, использование неявных
s полностью прозрачно от типа A
до типа B
нормально, когда вы можете всегда просматривать объект типа A
может использоваться всякий раз, когда требуется объект типа B
. Например, неявное преобразование String
в RandomAccessSeq [Char]
всегда имеет смысл - String
всегда концептуально можно рассматривать как последовательность символы (например, в C строка представляет собой просто последовательность символов). Звонок на x. foreach (println)
имеет смысл для all String
s.
С другой стороны, более явные преобразования должны использоваться, когда объект типа A
может иногда использоваться как объект типа B
. В вашем примере вызов foo ("bar")
не имеет смысла и вызывает ошибку. Поскольку в Scala нет проверенных исключений, вызов foo (s.toDate)
явно сигнализирует о том, что могло быть сгенерировано исключение ( s
может быть недействительной датой). Кроме того, foo ("bar" .toDate)
явно выглядит неправильно, а вам нужно обратиться к документации, чтобы понять, почему foo ("bar")
может быть неправильным.
Когда вы делаете неявное преобразование из X в Y (например, преобразование из String в Date выше), вы, по сути, говорите, что если бы у вас был полный контроль над записью X в первую очередь , вы бы сделали X реализацией или подклассом Y.
Если для X имеет смысл реализовать Y, добавьте преобразование. Если нет, то, возможно, это не подходит. Например, для String имеет смысл реализовать RandomAccessSeq [Char], но, возможно, для String не имеет смысла реализовывать Date (хотя String, реализующий StringDate, кажется прекрасным).
(Я немного опоздал, и Флавиу есть отличный ответ, но я хотел бы добавить комментарий о том, что я думаю о имплицитах.)