Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 使用带有方差的类标记_Scala - Fatal编程技术网

Scala 使用带有方差的类标记

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

我有一个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: 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