如何避免“非变量类型参数未经检查,因为它被擦除”?

5
我正在处理的项目中有以下代码段:

我正在处理的项目中有以下代码段:

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
}

因此,在编译过程中,我收到以下警告:

[warn] 非变量类型参数java.util.Date在类型模式java.util.Date,String)中未经检查,因为它被擦除

[warn] case t: (Date, String) => //do some things

实际上,我不理解这些警告意味着什么,以及如何重构代码以消除这些警告?


2
https://dev59.com/CHNA5IYBdhLWcg3wF5yO - fukanchik
1个回答

1

Try[+T] 是一个抽象类,你无法创建它的实例。

它有两个继承自它的 case class,SuccessFailure,你应该使用它们。

编译器警告你在编译时,类型擦除会擦除这些类型,因此匹配它们不会得到你想要的结果。更多信息可以在 如何解决Scala中的类型擦除?或者为什么我无法获取我的集合的类型参数? 中找到。

但是,如果你只匹配 SuccessFailure,就可以完全避免所有这些问题,从而减少匹配中不必要的嵌套:

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)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接