【问题标题】:Can you call an object method dynamically off class parameterization in Scala?你可以在 Scala 中动态地调用类参数化的对象方法吗?
【发布时间】:2011-06-29 12:06:31
【问题描述】:

我对 Scala 很陌生,但我正在尝试实现以下情况。假设我有一个特质:

trait SomeTrait {
  def kakaw
}

还有两个扩展它的 Scala 对象:

object SampleA extends SomeTrait {
  def kakaw = "Woof"
}

object SampleB extends SomeTrait {
  def kakaw = "Meow"
}

我想做的是基于参数化函数调用调用这两个对象函数之一。例如(我知道这是离正确最远的事情):

class SomeOther {
  def saySomething[T] = T.kakaw
}

所以我可以这样做:

val s = new SomeOther
s.saySomething[SampleA]

这在 Scala 中是否可行?

【问题讨论】:

  • def saySomething(t: SomeTrait) = t.kakaws.saySomething(SampleA) 有什么问题?也就是说,为什么要费心使用类型参数呢?
  • 你的具体例子是不可能的,因为SampleA不是类型,所以不能作为类型参数传递。
  • 您的问题得到解答了吗?

标签: scala scala-2.8


【解决方案1】:
& scala
Welcome to Scala version 2.8.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_23).
Type in expressions to have them evaluated.
Type :help for more information.

scala> trait SomeTrait {
     |   def kakaw : String
     | }
defined trait SomeTrait

scala> class SampleA extends SomeTrait {
     |   def kakaw = "Woof"
     | }
defined class SampleA

scala> implicit val sampleA = new SampleA
sampleA: SampleA = SampleA@42c71191

scala> class SampleB extends SomeTrait {
     |   def kakaw = "Meow"
     | }
defined class SampleB

scala> implicit val sampleB = new SampleB
sampleB: SampleB = SampleB@53601a4f

scala> class SomeOther {
     |   def saySomething[ T <: SomeTrait](implicit target : T) = target.kakaw
     | }
defined class SomeOther

scala> val s = new SomeOther
s: SomeOther = SomeOther@5947e54e

scala> s.saySomething[SampleA]
res0: String = Woof

【讨论】:

    【解决方案2】:

    这有点令人困惑,因为您需要有一个您的类型的实例来执行操作。仅仅传递一个类型可能会让编译器满意,但您当然希望确保提供您想要使用的某种类型的实例。

    (考虑到单例对象,可能会为此使用隐式证据参数,但除非真的需要,否则我不会这样做。)

    那么,在你的情况下,你为什么不直接说

    class SomeOther {
      def saySomething(obj: SomeTrait) = obj.kakaw
    }
    
    val s = new SomeOther
    s.saySomething(SampleA)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多