如何避免“非变量类型参数未选中,因为它已被擦除消除”?

ale*_*lex 5 scala future compiler-warnings

我正在做的一个项目有以下代码:

val ftr1: Future[Try[(Date, String)]] = Future {
  if (someCondition) {
    // some code
    val amazonClient = Try[new com.amazonaws.services.s3.AmazonS3Client(...)]
    amazonClient.map { c => 
    // doing some stuff
    (new Date, "SomeString")
    }
  } else {
    // some code
    Failure(new Exception)
  }
}

Future.firstCompletedOf(Seq(ftr1, anotherFuture)) map {
  case t: Try[(Date, String)] => {
    t match {
      case Success(r) => //do some things
      case _ => //do some another things
  }
  case _ => //do some another things
}
Run Code Online (Sandbox Code Playgroud)

因此,在编译期间,我有以下警告:

[警告] 类型模式 java.util.Date, String) 中的非变量类型参数 java.util.Date 未选中,因为它已被擦除消除

[warn] case t: (Date, String) => //做一些事情

我实际上不明白,这些警告是什么意思,如何重构这段代码以摆脱这些警告?

Yuv*_*kov 1

Try[+T]是一个抽象类,您无法创建其实例。

有两个从它继承的案例类,SuccessFailure,您应该真正使用它们。

编译器警告您,在编译时,类型擦除将擦除这些类型,因此对它们进行匹配不会得到您想要的结果。有关更多信息,请参阅如何解决 Scala 上的类型擦除?或者,为什么我无法获取集合的类型参数?

Success但是,如果您简单地进行匹配并Failure减少匹配中不必要的嵌套,则可以完全避免这一切:

val ftr1: Future[Try[(Date, String)]] = Future {
  if (someCondition) {
    // some code
    val amazonClient = Try { /* stuff */ }
    amazonClient.map { c => 
    // doing some stuff
    (new Date, "SomeString")
  } else Failure(new Exception)
}

Future.firstCompletedOf(Seq(ftr1, anotherFuture)) map {
   case Success((date, myString)) => /* do stuff */
   case Failure(e) => log(e)
}
Run Code Online (Sandbox Code Playgroud)