如何从类型中检索伴随对象

时间:2014-10-10 15:22:10

标签: scala

我想编写一个泛型方法,我需要从类型中检索伴随对象(尤其是apply方法)。

[update] X是一个案例类,因此伴随对象有一个apply方法。

例如:def f[X]() = X.apply("42")

2 个答案:

答案 0 :(得分:2)

没有通用的解决方案,也没有任何限制伴随对象有应用方法。它可以是没有申请的伴侣。我建议在这种情况下使用类型类模式。

  trait CompanionWithApply[T] {
    def apply(s: String): T
  }

  class X(s: String)
  object X extends CompanionWithApply[X] {
    def apply(s: String): X = new X(s)
  }

  class Y(s: String)
  object Y extends CompanionWithApply[Y]{
    def apply(s: String): Y = new Y(s)
  }

  implicit val XCompanion = X
  implicit val YCompanion = Y

  def f[T: CompanionWithApply] = implicitly[CompanionWithApply[T]].apply("42")

  println(f[X])
  println(f[Y])

答案 1 :(得分:1)

另一个小得多的解决方案,但你必须是X,Y必须是案例类

  case class X(s: String)
  case class Y(s: String)

  implicit def xConstruct = X
  implicit def yConstruct = Y

  def f[T](implicit construct: (String) => T) = construct("abc")

  println(f[X])
  println(f[Y])