簡體   English   中英

如何將方法的返回類型與 Scala 本機或 TypeTag 進行比較?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM