クラスが実装している特性を見つけるために、ScalaのどこかにイントロスペクションAPIがありますか?
Scala 2.9.2の場合、それはです。
Scala の Trait は Java のインターフェイスに変換されるため、Java のリフレクション ライブラリを使用して、実装されている Trait を見つけることができます。次に例を示します。
trait Foo
class Bar extends Foo
val b = new Bar
b.getClass.getInterfaces.foreach(println)
これは以下を出力します:
interface Foo
interface scala.ScalaObject
Kim Stebel が使用した例は、特性がスーパークラスによって実装されている場合は機能しないことに注意してください。より一般的な形式は次のとおりです。
def implementsInterface(target: Class[_], someInterface: Class[_]): Boolean = {
val i = target.getInterfaces
i.foreach((c: Class[_]) => if (c == someInterface) return true)
val s = target.getSuperclass
if (s == null) false
else implementsInterface(s, someInterface)
}