私はScalaの型クラスの概念を見つけましたが、実際には非常に好きです。私が見つけたすべての例では、1つのオブジェクトの下に型クラス(オブジェクト)が置かれているという問題があります(http://danielwestheide.com/blog/2013/02/06/the-neophytes-guide-to-scala-part-12-type-classes.html)複数の暗黙的オブジェクトからの自動インポート
多分これは間違っていますが、ですから、私がしたいのは、型クラスをいくつかのファイルに入れて、それぞれの実装を別々のオブジェクトに入れる必要があるということです。これで、すべての実装を手動でインポートする必要がある「問題」が発生するようになりました。ここで小さな例よりよく明確にする: -
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
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
object StringLike {
implicit object LikeStringLike extends Like[String] {
override def print(arg: String): Unit = println(s"STRING: $arg")
}
}
をこれは、これまでに動作します。私は知っている、アプリケーションでのワイルドカードのインポートは必要ではありませんが、それはポイントではありません。ご覧のとおり、ApplicationでStringLikeとIntLikeの両方をインポートする必要があります。そうしないと、Applicationオブジェクトでは使用できないためです。
これを一般的な方法で行うことは可能ですか、そうすることは完全に悪い習慣ですか?