Я только что нашел концепцию класса типа Scala и действительно так сильно. Проблема заключается в том, что все примеры, которые я нашел, помещают типы классов (объектов) под один объект (как здесь: http://danielwestheide.com/blog/2013/02/06/the-neophytes-guide-to-scala-part-12-type-classes.html)Автоматический импорт из нескольких неявных объектов
Возможно, это неправильно, но я являюсь другом одного файла в классе. Поэтому мне нравится делать классы типов в несколько файлов, что означает, что каждая реализация должна быть помещена в отдельный объект. Это теперь приводит к «проблеме», которую мне нужно импортировать каждую отдельную реализацию вручную. Для уточнения лучше здесь небольшой пример:
package sth
import sth.like.Like
import sth.like.StringLike._
import sth.like.IntLike._
object Application extends App {
def t[T](arg: T)(implicit l: Like[T]) = {
l.print(arg)
}
t(1)
t("Blub")
}
-
package sth.like
trait Like[T] {
def print(arg: T)
}
-
package sth.like
object IntLike {
implicit object LikeIntLike extends Like[Int] {
def print(arg: Int): Unit = println(s"INT $arg")
}
}
-
package sth.like
object StringLike {
implicit object LikeStringLike extends Like[String] {
override def print(arg: String): Unit = println(s"STRING: $arg")
}
}
Это работает до сих пор. Я знаю, импорт подстановочных знаков в приложении не нужен, но это не главное. Как вы можете видеть, мне нужно импортировать как StringLike, так и IntLike в приложение, потому что иначе они недоступны для объекта Application.
Так можно ли это сделать общим способом или это совсем плохая практика, чтобы сделать это таким образом?