2016-04-07 5 views
0

У меня есть простая функция:Самый простой способ обойти [SI-6976] в scala 2.10 для примитивного сопоставления шаблонов коллекции?

implicit class ArrayView[A](self: Array[A]) { 

    def filterByType[B <: A: ClassTag]: Array[B] = { 
     val ctg = implicitly[ClassTag[B]] 

     val runtimeClazz = ctg.runtimeClass 

     self.flatMap{ 
     v => 
      if (v.getClass.isAssignableFrom(runtimeClazz)) Some(v.asInstanceOf[B]) 
      else None 
     }.toArray 
    } 
    } 

и простой тестовый пример:

assert(Array(1, 2.2, "a").filterByType[Int].toSeq == Seq(1)) 
assert(Array(1, 2.2, "a").filterByType[java.lang.Integer].toSeq == Seq(1: java.lang.Integer)) 
assert(Array(1, 2.2, "a").filterByType[Double].toSeq == Seq(2.2)) 
assert(Array(1, 2.2, "a").filterByType[java.lang.Double].toSeq == Seq(2.2: java.lang.Double)) 
assert(Array(1, 2.2, "a").filterByType[String].toSeq == Seq("a")) 

это работает только в Scala> 2.11.3 (из-за https://issues.scala-lang.org/browse/SI-6967, это было вызвано в течение некоторого времени), но у многих библиотек (например, spark-hive_thriftserver) все еще есть проблемы с портированием на 2.11, а 2.10 в большинстве случаев стабильны для большинства других случаев, есть ли быстрый патч для этой ошибки?

ответ

1

OK это действительно обалденный, но независимо от того:

implicit class ArrayView[A](self: Array[A]) { 

    def filterByType[B <: A: ClassTag]: Array[B] = { 
     self.flatMap{ 
     v => 
      try { 
      Array[B](v.asInstanceOf[B]) 
      } 
      catch { 
      case e: Throwable => 
       Array[B]() 
      } 
     }.toArray 
    } 
    } 

пройти все испытания