Поиск параметров типа через reflection в Scala 2.10?

Используя tags типа, я могу видеть параметры некоторого типа:

scala> import scala.reflect.runtime.universe._ import scala.reflect.runtime.universe._ scala> typeOf[List[Int]] res0: reflect.runtime.universe.Type = List[Int] 

Но я просто не могу понять, как программно получить этот «Int» оттуда в общем виде.

(Я бродил по REPL в течение часа, пытаясь перестановки в Type, чтобы увидеть, что я могу получить от него … Я получаю много вещей, которые указывают, что это «Список», но удачи в поиске что «Int»! И я действительно не хочу прибегать к анализу вывода toString () …)

Даниэль Собрал имеет превосходный (как обычно) быстрый обзор здесь , в котором он получает мучительно близко к тому, что я ищу, но (видимо), только если вы знаете, для этого конкретного classа, какой-то конкретный метод, тип которого может быть допрошены:

 scala> res0.member(newTermName("head")) res1: reflect.runtime.universe.Symbol = method head scala> res1.typeSignatureIn(res0) res2: reflect.runtime.universe.Type = => Int 

Но я надеюсь на что-то более общее, что не связано с укоренением в списке объявленных методов и надеется, что один из них будет захватывать (и тем самым разглашать) текущую информацию о типе где-то.

Если Scala может так легко напечатать «List [Int]», почему же так трудно обнаружить, что часть «Int» этого – не прибегая к сопоставлению строк? Или я просто пропустил что-то действительно, действительно очевидное?

 scala> res0.typeSymbol.asInstanceOf[ClassSymbol].typeParams res12: List[reflect.runtime.universe.Symbol] = List(type A) scala> res12.head.typeSignatureIn(res0) res13: reflect.runtime.universe.Type = 

Grr …

    2 Solutions collect form web for “Поиск параметров типа через reflection в Scala 2.10?”

    К сожалению, я не думаю, что есть метод, который даст вам параметры, но вы можете овладеть ими следующим образом:

     Welcome to Scala version 2.10.0-20121007-145615-65a321c63e (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_35). Type in expressions to have them evaluated. Type :help for more information. scala> import scala.reflect.runtime.universe._ import scala.reflect.runtime.universe._ scala> typeOf[List[Int]] res0: reflect.runtime.universe.Type = scala.List[Int] scala> res0 match { case TypeRef(_, _, args) => args } res1: List[reflect.runtime.universe.Type] = List(Int) scala> res1.head res2: reflect.runtime.universe.Type = Int 

    Редактировать Вот немного лучший способ добиться того же (после обсуждения scala-internals ):

     scala> res0.asInstanceOf[TypeRefApi].args res1: List[reflect.runtime.universe.Type] = List(Int) 

    Начиная с Scala 2.11 , вы можете просто использовать:

     yourGenericType.typeArgs.head 

    См. Строку с изменением списка макросов номер 14.

    Interesting Posts

    Отключить автоматическое обновление драйвера только для одного устройства в Windows 10

    Как конвертировать дату в формат yyyy-MM-dd?

    Как заставить Fish shell и NVM установить вместе с Homebrew для совместной работы?

    Может ли кто-нибудь объяснить RAID-0 на простом английском языке?

    Как опубликовать .php страницу вместо .html в github для демонстрации некоторых php-контента?

    Как создать .NET DateTime из ISO 8601

    Есть ли способ избавиться от акцентов и преобразовать целую строку в обычные буквы?

    Как скопировать Ctrl-p в стрелку вверх с помощью xmodmap?

    Есть ли у Java что-то вроде ссылок на ключевые слова C #?

    Сделать Chrome New Tab полностью пустым

    Является ли String.Format таким же эффективным, как StringBuilder

    Черный экран Android VideoView

    Удаление элементов из коллекции во время итерации

    Ошибка HTTP 500.19 – Внутренняя ошибка сервера

    Изменяйте программный цвет с возможностью рисования

    Давайте будем гением компьютера.