Scala: Как проверить, что динамически загружаемый класс реализует черту? - PullRequest
0 голосов
/ 03 июня 2018

Я пытаюсь создать приложение Scala, в котором пользователь может загружать классы, реализующие интерфейс, определенный признаком, который приложение затем будет использовать.

Например, моя черта Operator

trait Operator {
    def operate(a: Int, b: Int): Int
}

реализуется пользовательским классом, который загружается во время выполнения, Add.

class Add {
  def operate(a: Int, b: Int): Int = a + b
}

Как приложение может проверить, что этот класс Add реализует черту Operator, о которой он знает?Я хотел бы иметь возможность вызывать operate на экземпляре загруженного класса.

Я пробовал простое сопоставление с шаблоном, как это

case op: Class[Operator] => op.newInstance()

, но, похоже, для проверки реализации на основеимя черты, а не подписи членов.

1 Ответ

0 голосов
/ 03 июня 2018

Прежде всего, давайте очистим терминологию, ваша class Add просто не implement черта Operator, которую вы определили.Вы не должны и не можете использовать четко определенные термины для обозначения чего-то иного, отличного от их фактического значения.

Теперь вы ищете structural types, а не traits.

Позволяетопределить strucural type с именем IsOperator,

type IsOperator = {
  def operate(a: Int, b: Int): Int
}

И давайте определим что-то логическое, что использует это,

def perform(a: Int, b: Int, o: IsOperator): Int = o.operate(a, b)

Теперь, любой object или экземпляр любого class который подтверждает structural type IsOperate (имеет метод с именем operate с типом (Int, Int) => Int), может использоваться с perform.

object Add {
  def operate(a: Int, b: Int): Int = a + b
}

val sum = perform(1, 2, Add)
// sum: Int = 3
...