Scala:如何检查动态加载的类是否实现了特征?

时间:2018-06-03 14:47:51

标签: scala pattern-matching traits

我正在尝试构建一个Scala应用程序,用户可以在其中加载实现由特征定义的接口的类,然后应用程序将使用该特性。

例如,我的操作员特质

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

由要在运行时加载的用户定义类实现,添加。

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

应用程序如何检查此Add类是否实现了它所知道的运算符特征?我希望能够在加载的类的实例上调用operate

我尝试过像这样的简单模式匹配

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

但这似乎是基于特征名称而不是成员签名来检查实现。

1 个答案:

答案 0 :(得分:3)

首先,请清除术语,class Add根本没有implement您定义的Operator特征。您不应该也不能使用明确定义的术语来表示与其实际含义相比的不同内容。

现在,您要找的是structural types而不是traits

让我们定义一个名为strucural type的{​​{1}},

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