2016-07-27 22 views
3

一个项目,我就有下面的一段代码工作:编译期间如何避免'非变量类型参数未被检查,因为它被擦除'消除?

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 
} 

所以,我有以下警告:

[提醒]非可变型参数java.util.Date中因为它是由擦除消除型图案java.util.Date,字符串)未选中

[提醒]案例T:(日期,字符串)=> //做一些事情

实际上我不明白,这是什么意思的警告,以及如何可以将此代码,以摆脱被重构这些警告?

+2

http://stackoverflow.com /问题/ 1094173 /怎么办-I-获得全能型擦除的上阶或 - 为什么 - 倾斜-I-GET-的型paramete – fukanchik

回答

1

Try[+T]是一个抽象类,你不能创建一个实例。

有两种案例类,它们继承它,SuccessFailure,你应该真的使用它。

编译器警告你,在编译时,类型擦除将擦除这些类型,因此匹配它们不会得到你想要的结果。更多关于可在How do I get around type erasure on Scala? Or, why can't I get the type parameter of my collections?

中查到,但是,你可以完全避免这一切,如果你简单地匹配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) 
} 
相关问题