#scala
#scala
Вопрос:
Я знаю, что вы можете сопоставлять теги типов, когда у вас их два, но как вы выполняете такого рода действия, когда один из ваших объектов «Any» ? Есть ли какой-либо способ выполнить приведенный ниже (неправильный) код? Имейте в виду, функция «confirm» предназначена для использования типа Any, чтобы она могла оставаться гибкой во время выполнения. Спасибо
import scala.reflect.runtime.universe._
object TestRun extends App {
class Matcher[T:TypeTag] {
def confirm(x:Any):Boolean { //I don't want to add paramaters to this, must remain Any
val myTT = implicitly[TypeTag[T]]
x.isInstanceOf [myTT.tpe] // return an answer?
}
}
val m =new Matcher[Int]
//example of the output I would expect
m.confirm(44) //true
m.confirm("test") //false
val m2 =new Matcher[Seq[String]]
m2.confirm(Seq("A","B","C") //true
}
Ответ №1:
Вы можете использовать это:
def confirm(x: Any): Boolean = {
val myTT = implicitly[TypeTag[T]]
println(x.getClass)
println(myTT.mirror.runtimeClass(myTT.tpe))
// Compiles, but only exact matches
//x.getClass == myTT.mirror.runtimeClass(myTT.tpe)
// Better, but not perfect
myTT.mirror.runtimeClass(myTT.tpe).isAssignableFrom(x.getClass)
}
В принципе это работает, но
- Вам нужно добавить дополнительный код для обработки int / java.lang.Integer et. al.
- Возможно, вам придется добавить код для обработки типа элемента коллекции / контейнера и т.д., Поскольку этот тип стирается, поэтому он не учитывается в приведенном выше сравнении.