Итак, я использую библиотеку отражений Scala и пытаюсь проверить, соответствует ли метод заданному типу. Чтобы упростить, я пытаюсь проверить только его вывод.
Что у меня есть сейчас:
val returnType = methodSymbol.returnType
// returnType: reflect.runtime.universe.Type = java.lang.String
Итак, я могу прочитать, что это строка, но она имеет ужасный тип reflect.runtime.universe.Type
. Как я могу сравнить проверку, если этот возвращаемый тип является простой строкой? Я даже пытался использовать TypeTags, которые достаточно просты, но преобразование Type
в TypeTag
требует таких монументальных усилий, что я не верю, что такую простую задачу нельзя решить проще.
Итак, как я могу сравнить это со строкой и просто получить логическое значение? Я думал просто вызвать toString()
и попытаться проанализировать его обратно в нормальный тип, но это было бы действительно отвратительно делать в коде, IMO. Кроме того, я не могу просто указать имя метода, потому что я работаю над списком методов, и позже будет больше.
Я видел несколько вопросов и даже этот (на мой взгляд, абсурдно сложный) ответ о том, как преобразовать тип в TypeTag, но, опять же, меня сбивает с толку уровень сложности такой тривиальной задачи. Я уже подумываю вырвать свои редкие волосы. Помощь приветствуется.
РЕДАКТИРОВАТЬ: мне удалось провести сравнение для самой строки, но не для метода, возвращающего строку.
Чтобы сравнить возвращаемый тип String, я делаю:
val returnType = methodSymbol.returnType
returnType =:= typeTag[String].tpe
Однако, когда я пытаюсь проверить это с помощью наследования и метода, используя <:<
, это не сработает. Чтобы уточнить, B расширяет черту A, сигнатура типа () => B
, но я не могу сопоставить при кодировании
val typeSig = methodSymbol.typeSig
typeSig <:< typeTag[() => A].tpe
returnType == typeOf[String]
? - person user   schedule 12.06.2020returnType
не является TypeTag, как было сказано ранее. - person Lucas Lima   schedule 12.06.2020typeOf
возвращаетType
, а неTypeTag
, насколько мне известно. Посмотрите эту игровую площадку Scastie: scastie.scala-lang.org/sQDO2hDJThyKuUiWaZWRmQ - person user   schedule 12.06.2020typeTag
. Виноват. Во всяком случае, я попытался это сделать, и он выдал забавное `found: ru.Type/required: Reflect.runtime.universe.Type`. Используя typeTag и преобразовав его в тип, теперь он работает, хотя и не соответствует наследованию. - person Lucas Lima   schedule 12.06.2020ru
являетсяscala.reflect.runtime.universe
- person user   schedule 12.06.2020returnType
равноB
, почему вы проверяетеreturnType <:< typeTag[() => B].tpe
(то естьreturnType <:< typeOf[() => B]
)? Это не может быть правдой. - person Dmytro Mitin   schedule 12.06.2020returnType <:< typeOf[() => A]
возвращаетtrue
scastie.scala-lang.org/4q5BilFTSQCSw3UTkufvxQ - person Dmytro Mitin   schedule 12.06.2020returnType <:< typeOf[() => A]
даетfalse
, вы должны предоставить более подробную информацию о том, как воспроизвести ваше поведение (напишите весь код). - person Dmytro Mitin   schedule 12.06.2020returnType
получено изMethodSymbol
, тоreturnType <:< typeOf[() => A]
все равно возвращаетtrue
scastie.scala-lang.org/UQBTG9ytTv2Pgwn8RxlVEw а> - person Dmytro Mitin   schedule 12.06.2020returnType
иtypeSignature
будут возвращать объекты одного и того же типа - это неверно. Действительно, сreturnType
работает нормально. Я исправлю вопрос (еще раз) и приму ваш ответ. - person Lucas Lima   schedule 12.06.2020