В Scala, как получить возвращенный TypeTag метода класса?

У меня есть класс:

package org.apache.project

class Foo {

def bar: List[Bar] = ...
}

это способ отражения scala, который позволяет мне получить typeOf[List[Bar]] из className «org.apache.project.Foo» и имени метода «bar»?

Большое спасибо за твою помощь!


person tribbloid    schedule 27.05.2016    source источник


Ответы (1)


Да, если у вас есть Foo как Type, вы также можете найти возвращаемый тип метода bar как Type.

import scala.reflect.runtime.universe._

typeOf[Foo]                        // Get the type of Foo
   .decls                          // Get Foo's declared members
   .find(_.name.toString == "bar") // Find the member named "bar" as a symbol
   .head                           // Unsafely access it for now, use Option and map under normal conditions
   .asMethod                       // Coerce to a method symbol
   .returnType                     // Access the return type
person Michael Zajac    schedule 27.05.2016
comment
Большое спасибо! позвольте мне сначала попробовать. - person tribbloid; 28.05.2016
comment
Я не думаю, что это работает, во-первых, .decls не может быть найден в TypeTag (устаревшее? должно быть .members). Во-вторых, если Foo является общей функцией, вывод returnType будет стерт. - person tribbloid; 09.06.2016
comment
См. stackoverflow.com/questions/37714572/ для встречного примера - person tribbloid; 09.06.2016
comment
@tribbloid decls является членом Type, а не TypeTag. Обратите внимание, как я использую typeOf. Если у вас есть TypeTag, то вы сначала должны позвонить tpe. например typeTag[Foo].tpe.decls.... - person Michael Zajac; 09.06.2016
comment
Я использую Scala 2.10, и .decls также не может быть найден в Type, но я нашел ответ в ссылке, которую я разместил - person tribbloid; 10.06.2016
comment
@tribbloid Это в Scala 2.11. Библиотека отражения в версии 2.11 более полная, чем в версии 2.10. Код буквально вышел из рабочего REPL-сеанса. - person Michael Zajac; 10.06.2016