Можете ли вы динамически вызывать объектный метод вне параметризации класса в Scala? - PullRequest
1 голос
/ 18 февраля 2011

Я довольно новичок в 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?

Ответы [ 2 ]

4 голосов
/ 18 февраля 2011
& 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
3 голосов
/ 18 февраля 2011

Это немного сбивает с толку, потому что вам нужно иметь экземпляр вашего типа для работы. Простая передача типа может сделать компилятор счастливым, но вы, безусловно, хотите убедиться, что вы предоставляете тот самый экземпляр типа, с которым хотите работать.

(Принимая во внимание одноэлементные объекты, можно обойтись без использования неявных параметров доказательств, но я бы не стал этого делать, если бы в этом не было необходимости).

Итак, в вашем случае, почему бы вам просто не сказать

class SomeOther {
  def saySomething(obj: SomeTrait) = obj.kakaw
}

val s = new SomeOther
s.saySomething(SampleA)
...