如何避免使用广义类型约束的强制转换?

St.*_*rio 0 types scala

我正在设计以下特征和方法:

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)

是否有可能消除这种演员阵容?

Joe*_*e K 5

所述=:=类实际上具有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)