3

次のコードを検討してください。

object Foo{def foo(a:Int):List[(String, Int)] = ???}

class Bar{def bar(a:Int, b:Any):Option[(String, Long)] = ???}

オブジェクトまたはクラスのいずれかが与えられた場合、まずメソッド名を見つける必要があります (それほど難しくないようです)。

その後、各メソッドについて、Scalaの戻り値の型 (Java のものではない) の文字列の説明を見つけたいと思います。たとえば、 forFoo.fooには String が必要で、List[(String, Int)]forBar.barには String が必要Option[(String, Long)]です。

これこのチュートリアルを見ましたが、理解できませんでした。

編集:コメントに基づいて試したのは次のとおりです。

class RetTypeFinder(obj:AnyRef) {
  import scala.reflect.runtime.{universe => ru}
  val m = ru.runtimeMirror(getClass.getClassLoader)
  val im = m.reflect(obj)
  def getRetType(methodName:String) = {
    ru.typeOf[obj.type].declaration(ru.TermName(methodName)).asMethod.returnType
  }
}
object A { def foo(a:Int):String = ??? } // define dummy object
class B { def bar(a:Int):String = ??? } // define dummy class
val a = new RetTypeFinder(A) 
a.getRetType("foo")  // exception here
val b = new RetTypeFinder(new B) 
b.getRetType("bar")  // exception here

私が得るエラーは次のとおりです。

scala.ScalaReflectionException: <none> is not a method
at scala.reflect.api.Symbols$SymbolApi$class.asMethod(Symbols.scala:228)
at scala.reflect.internal.Symbols$SymbolContextApiImpl.asMethod(Symbols.scala:84)
at cs.reflect.Test.getRetCls(Test.scala:11)
...

ただし、これは機能します(REPLで試しました):

import scala.reflect.runtime.{universe => ru}
val m = ru.runtimeMirror(getClass.getClassLoader)

object A { def foo(a:Int):String = ??? } // define dummy object

val im = m.reflect(A)
ru.typeOf[A.type].declaration(ru.TermName("foo")).asMethod.returnType

class B { def bar(a:Int):String = ??? } // define dummy class

val im = m.reflect(new B)
ru.typeOf[B].declaration(ru.TermName("bar")).asMethod.returnType

どのオブジェクト/クラスが渡されるかが事前にわからない最初の方法で使用する必要があります。どんな助けでも大歓迎です。

4

1 に答える 1