Convertir Java "trier" signature avec"? super T ' à Scala (génériques)
Le problème:
En regardant cette question sur la migration de la signature Java
public <A extends Comparable<? super A>> void sort(List<A> list) { }
Pour Scala, il ne semble pas y avoir de moyen d'éviter un
illegal cyclic reference involving type T
Erreur si vous faites une traduction littérale comme celle-ci.
def compilerFailure[T <: Comparable[_ >: T]](a: Array[T]): T = { }
La solution de contournement semble être de le faire à la place
def workaround[A <: Comparable[U], U >: A](list: List[A]) { }
Qui si vous faites un aller-retour du code octet vers Java, vous obtenez ceci (ce qui perd le super
partie)
public <T extends Comparable<U>, U> void scalaToJava(List<U> a) { }
Mes questions:
La version scalaToJava
est-elle équivalente à la suivante?
public <T extends Comparable<?>> void sort(List<T> a) {
J'ai pensé quand U
est sans limite, il pourrait aussi bien être ?
ou Object
non? Alors si c'est le cas, la version Scala workaround
est-elle équivalente à
def sort[A <: Comparable[_]](list: List[A]) { }
Ils semblent tous compiler pour mon cas d'utilisation (qui consiste à mettre différents sous-types dans une collection et à pouvoir les trier). NB. je suis curieux de savoir la mécanique et ce qui provoque l'erreur de référence cyclique et se rendre compte que Scala offre de meilleures alternatives en termes de covariance etc (ie Ordering
).
1 answers
public <T extends Comparable<?>> void sort(List<T> a)
Est trop général car vous pourriez par exemple passer un List<A> extends Comparable<Int>
où la fonction de comparaison ne serait pas applicable aux valeurs de type List<A>
.
Vous étiez sur la bonne voie avec votre solution de contournement mais vous avez fait une petite erreur. Il devrait être:
def workaround[A <: Comparable[A], U >: A](list: List[U]) { }
Mais notez que ce n'est pas la façon dont ce genre de situation est généralement résolu dans Scala:
Voir scala.math.Ordering
.