我正在设计以下特征和方法:
trait Reader[T]{
def read(): T
}
def rd[T, A](r: Reader[T])(implicit ev: T =:= Option[A]): Either[String, A] = r.read() match {
case Some(a) => Right(a) // <---- compile error here
case None => Left("End reached")
}
Run Code Online (Sandbox Code Playgroud)
问题是我在上面的代码中遇到了编译错误:
Error:(17, 27) type mismatch;
found : a.type (with underlying type Any)
required: A
case Some(a) => Right(a)
Run Code Online (Sandbox Code Playgroud)
但是当我明确地添加类型时,它会编译一个警告:
trait Reader[T]{
def read(): T
}
def rd[T, A](r: Reader[T])(implicit ev: T =:= Option[A]): Either[String, A] = r.read() match {
case Some(a: A) => Right(a) // <--- Warning here
case None => Left("End reached")
}
Run Code Online (Sandbox Code Playgroud)
警告:
Warning:(17, 18) abstract type pattern A is unchecked since it is eliminated by erasure
case Some(a: A) => Right(a)
Run Code Online (Sandbox Code Playgroud)
是否有可能消除这种演员阵容?
所述=:=类实际上具有apply安全地从它的第一类型参数到它的第二转换方法.这样可行:
def rd[T, A](r: Reader[T])(implicit ev: T =:= Option[A]): Either[String, A] = ev(r.read()) match {
case Some(a) => Right(a)
case None => Left("End reached")
}
Run Code Online (Sandbox Code Playgroud)