2016-07-27 1 views
3

Un projet sur lequel je travaille a le code de pièce suivant:Comment éviter 'L'argument de type non-variable est décoché puisqu'il est éliminé par effacement'?

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 
} 

Ainsi, lors de la compilation je avertissement suivant:

[warn] argument de type non variable dans java.util.Date motif de type java.util.Date, String) est désélectionnée car elle est éliminée par l'effacement

et

[warn] affaire T: (date, String) => // faire des choses

Et fait, je ne comprends pas, ce que ces avertissements signifient et comment ce code peut être refactorisé afin de se débarrasser de ces avertissements?

+2

http://stackoverflow.com/questions/1094173/how-do-i-get-around-type-effacement-sur-scala-ou-pourquoi-cant-i-get-le-type-paramete – fukanchik

Répondre

1

Try[+T] est une classe abstraite, dont vous ne pouvez pas créer une instance.

Il existe deux classes de cas qui en héritent, Success et Failure, que vous devriez vraiment utiliser.

Le compilateur vous avertit qu'au moment de la compilation, l'effacement de type va effacer ces types, donc leur correspondance ne vous donnera pas les résultats que vous voulez. Plus sur le sujet qui se trouve dans How do I get around type erasure on Scala? Or, why can't I get the type parameter of my collections?

Mais, vous pouvez éviter tout cela complètement si vous correspondez simplement sur Success et Failure pour réduire l'imbrication inutile dans votre match:

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