Scala 使用带有方差的类标记
我有一个Transformer,它只是一个scala函数,但需要ClassTag与遗留代码进行互操作:Scala 使用带有方差的类标记,scala,Scala,我有一个Transformer,它只是一个scala函数,但需要ClassTag与遗留代码进行互操作: trait Transformer[F, T] extends (F => T) { implicit def cF: ClassTag[F] implicit def cT: ClassTag[T] /** * Append another transformer to this transformer */ def >=>[U: ClassT
trait Transformer[F, T] extends (F => T) {
implicit def cF: ClassTag[F]
implicit def cT: ClassTag[T]
/**
* Append another transformer to this transformer
*/
def >=>[U: ClassTag](f: Transformer[T, U]): Transformer[F, U] = Transformer(this andThen f)
}
/** Helper to view a function as a transformer */
object Transformer {
def apply[F: ClassTag, T: ClassTag](f: F => T): Transformer[F, T] = new AbstractTransformer[F, T] {
override def apply(x: F): T = f(x)
}
}
abstract class AbstractTransformer[F, T](implicit override val cF: ClassTag[F], override val cT: ClassTag[T]) extends Transformer[F, T]
但是,我希望在T
和F
中使用与scala相同的方差
功能1是什么
trait Transformer[-F, +T] extends (F => T)
然而,这导致了
逆变型F出现在type=>
cF Transformer.scala方法的scala.reflect.ClassTag[F]
协变类型在类型=>
方法cT Transformer.scala的scala.reflect.ClassTag[T]
我能解决这个问题吗
import scala.annotation.unchecked.uncheckedVariance
...
implicit def cF: ClassTag[F @uncheckedVariance]
implicit def cT: ClassTag[T @uncheckedVariance]
但是,使用时需要小心:错误是有原因的!例如,考虑
val t: Transformer[String, Object] = ...
val t1: Transformer[Object, String] = t // legal by variance
val c1 = t1.cF // the compiler thinks it's a ClassTag[Object], but really it's the ClassTag for String
val c2 = t1.cT // vice versa