2016-04-01 13 views
1

から防ぐことはできませんが、私はTraversableLikeのために、単純なヘルパー関数を書いている:ScalaのTypeTagがこのスレッドでは型消去

How to specify a type parameter in calling a function while let the compiler infer the other?

私は次の関数を実装します。

implicit class TraversableLikeView[A, Repr](self: TraversableLike[A, Repr]) { 

    def filterByType[B: TypeTag] = new FilterByType[B] 

    class FilterByType[B: TypeTag] { 

     def get[That](implicit bf: CanBuildFrom[Repr, B, That]): That = { 
     val result = self.flatMap{ 
      v => 
      val unboxed = Utils.javaUnbox(v) 
      unboxed match { 
       case x: B => Some(x) 
       case _ => None 
      } 
     }(bf) 
     result 
     } 
    } 
    } 

ClassTag.unapplyはプリミティブクラスの処理に問題があったため、TypeTagが使用されています。 (ClassTagはここで、ほぼ完璧な仕事をしていた)

Warning:(304, 23) abstract type pattern B is unchecked since it is eliminated by erasure 
       case x: B => Some(x) 
        ^

行うことを主張するTypeTag何に反している:私は上記のコードをコンパイルするときしかし、私は次の警告を得ました。この場合、TypeTagが失敗する理由はありますか?

答えて

1

あなたはそれからClassを得ることができますし、一般でTypeTagからClassを得ることができないので、これはのみ、ClassTagによってサポートされています。たとえば、マクロでは、クラスはまだコンパイルされていません。しかし、おそらくあなたは

implicit val classTagB = ClassTag[B](mirror.runtimeClass(typeTag[B].tpe)) 
+0

を書くことができ、その場合にはscala.reflect.runtime.universe.TypeTagを、使用している私はClassTagはすでに最新のScalaのバージョンでは廃止され、TypeTagが後継者であると思いましたか?では、TypeTagは何のために適していますか? – tribbloid

+0

いいえ、 'ClassTag'は推奨されていません。 'ClassManifest'があり、' ClassTag'がその置き換えです。 –

関連する問題