2016-07-27 49 views
3

Ein Projekt arbeite ich an hat das folgende Stück Code:Wie kann man vermeiden, dass das Argument "Nicht variables Argument deaktiviert ist, da es durch Löschen gelöscht wird"?

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 
} 

Also, ich habe folgende Warnung beim Kompilieren:

[warnen] non-Variablentyp Argument java.util.Date in Typ Muster java.util.Date, String) ist nicht aktiviert, da sie durch das Löschen eliminiert

und

[warnen] Fall t: (Datum, String) => // einige Dinge tun

Und ich verstehe wirklich nicht, was diese Warnungen bedeuten und wie kann dieser Code, um Refactoring loswerden dieser Warnungen?

+2

http://stackoverflow.com/questions/1094173/how-do-i-get-around-type-Löschung-auf-scala-oder-warum-cant-i-get-the-type-Parameter – fukanchik

Antwort

1

Try[+T] ist eine abstrakte Klasse, von der Sie keine Instanz erstellen können. Es gibt zwei Fallklassen, die davon erben, Success und Failure, die Sie wirklich verwenden sollten.

Der Compiler warnt Sie, dass bei der Kompilierung Typ löschen diese Typen löschen wird, so dass das Matching auf ihnen nicht die gewünschten Ergebnisse bringt. Mehr dazu finden Sie in How do I get around type erasure on Scala? Or, why can't I get the type parameter of my collections?

Aber zu finden, können Sie all dies vermeiden vollständig, wenn Sie einfach auf Success und Failure passen die unnötige Verschachtelung in Ihrem Spiel zu reduzieren:

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