Можете ли вы вызвать метод объекта динамически вне параметризации класса в Scala?

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


person sbowman    schedule 18.02.2011    source источник
comment
Что не так с def saySomething(t: SomeTrait) = t.kakaw, а затем с s.saySomething(SampleA)? То есть, зачем вообще заморачиваться с параметром типа?   -  person Rex Kerr    schedule 18.02.2011
comment
Ваш конкретный пример невозможен, потому что SampleA не является типом, поэтому вы не можете передать его в качестве параметра типа.   -  person Daniel C. Sobral    schedule 18.02.2011
comment
На ваш вопрос ответили?   -  person James Iry    schedule 21.02.2011


Ответы (1)


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

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

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

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

val s = new SomeOther
s.saySomething(SampleA)
person Debilski    schedule 18.02.2011