Удаление экземпляра при совпадении типа «Any»?

#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.
  • Возможно, вам придется добавить код для обработки типа элемента коллекции / контейнера и т.д., Поскольку этот тип стирается, поэтому он не учитывается в приведенном выше сравнении.