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

Author: Community, 2014-10-16

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.

 4
Author: Martin Ring, 2014-10-17 09:47:01