通过匹配类型"任何"?实例擦除

时间:2014-07-06 04:09:51

标签: scala

我知道当你有两个时,你可以匹配类型标签,但是如果你的一个对象是"任何"你怎么做到这一点呢? ?有没有办法完成下面的(不正确的)代码?请记住,功能"确认"设计为采用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 个答案:

答案 0 :(得分:0)

你可以在此基础上建立:

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等。人。
  • 您可能需要添加代码来处理元素的集合/容器等类型,因为该类型已被删除,因此在上面的比较中不予考虑。