[英]How to compare the return type of a method to a Scala native or TypeTag?
因此,我正在使用 Scala 反射庫,並且我正在嘗試檢查方法是否符合給定類型。 為了簡化,我試圖只檢查它的 output。
我現在擁有的是:
val returnType = methodSymbol.returnType
// returnType: reflect.runtime.universe.Type = java.lang.String
所以,我可以讀到它是一個字符串,但它有這種可怕的類型reflect.runtime.universe.Type
。 我到底如何比較檢查這個返回類型是否是一個簡單的字符串? 我什至嘗試使用很簡單的 TypeTag,但是將Type
轉換為TypeTag
是一項巨大的努力,我不相信這樣簡單的任務無法用更簡單的方式完成。
那么,我怎樣才能將其與字符串進行比較並簡單地返回 boolean 呢? 我想簡單地調用一個toString()
並嘗試將其解析回正常類型,但這在代碼上真的很惡心,IMO。 另外,我不能簡單地指定方法名稱,因為我正在處理一個方法列表,以后還會有更多。
我已經看到了一些問題,甚至這個(在我看來,非常復雜)關於如何將 Type 轉換為 TypeTag 的答案,但是,我再次對如此微不足道的任務的復雜程度感到困惑。 我已經在考慮拔掉我稀少的頭發了。 幫助表示贊賞。
編輯:我已經設法對字符串本身進行了比較,但沒有對返回字符串的方法進行比較。
為了比較 String 返回類型,我正在做:
val returnType = methodSymbol.returnType
returnType =:= typeTag[String].tpe
但是,當我嘗試使用 inheritance 和一種方法檢查它時,使用<:<
,它不起作用。 澄清一下, B 擴展了 Trait A,類型簽名是() => B
,但我在編碼時無法匹配
val typeSig = methodSymbol.typeSig
typeSig <:< typeTag[() => A].tpe
如果您想將類型作為String
使用,您應該解析它們
import scala.reflect.runtime.universe
import scala.reflect.runtime.universe._
import scala.tools.reflect.ToolBox
val tb = universe.runtimeMirror(getClass.getClassLoader).mkToolBox()
val str = "java.lang.String"
val tpe: Type = (tb.typecheck(tb.parse(s"type T = $str"), mode = tb.TYPEmode) match {
case q"type T = $typ" => typ
}).tpe // String
tpe =:= typeOf[String] //true
(我只想做tb.typecheck(tb.parse(str/*, mode =???*/), mode = tb.TYPEmode).tpe
但找不到如何在運行時調用TypeParser
而不是TermParser
反射,這對應於tq"..."
和q"..."
之間的區別,否則我會得到String
伴侶而不是String
本身。當然tq"$str"
也會給出錯誤的類型,因為它是一個宏,它只能工作對於編譯時文字: tq"java.lang.String"
。)
也許不完全符合您的要求,但您可以在 Scala 中使用java.lang.reflect
。
import java.lang.reflect.Method
class C {
def doSomething(): String = {
return "hello"
}
def doSomethingElse(): String = {
return "bye"
}
def doNothing(): Int = {
return 190
}
}
val doSomethingMethod: Method = classOf[C].getMethods()(2)
val doNothingMethod: Method = classOf[C].getMethods()(1)
val doSomethingElseMethod: Method = classOf[C].getMethods()(0)
// false
doSomethingMethod.getReturnType.equals(doNothingMethod.getReturnType)
// true
doSomethingMethod.getReturnType.equals(doSomethingMethod.getReturnType)
// you can compare the simple name, too, if that's easier
println(s"'${doSomethingMethod.getReturnType.getSimpleName}'")
// 'String'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.