Pourquoi Scala se plaint-il d'un héritage illégal alors qu'il existe des types bruts dans la hiérarchie des classes ?

StackOverflow https://stackoverflow.com/questions/4991671

Question

J'écris un wrapper qui prend un Scala ObservableBuffer et incendies d'événements compatibles avec le Liaison de données Eclipse/JFace cadre.

Dans le framework Databinding, il existe un résumé ObservableList qui décore une liste Java normale.Je voulais réutiliser cette classe de base, mais même ce simple code échoue :

val list = new java.util.ArrayList[Int]
val obsList = new ObservableList(list, null) {}

avec des erreurs :

illegal inheritance; anonymous class $anon inherits different type instances of trait Collection: java.util.Collection[E] and java.util.Collection[E]
illegal inheritance; anonymous class $anon inherits different type instances of trait Iterable: java.lang.Iterable[E] and java.lang.Iterable[E]

Pourquoi?Est-ce que cela a à voir avec les types bruts ? ObservableList met en oeuvre IObservableList, qui étend le type brut java.util.List.Est-ce un comportement attendu et comment puis-je le contourner ?

Était-ce utile?

La solution

Avoir un type brut Java dans la hiérarchie d'héritage provoque ce genre de problème.Une solution consiste à écrire un tout petit peu de Java pour corriger le type brut comme dans la réponse à La classe Scala ne peut pas remplacer la méthode de comparaison de l'interface Java qui étend java.util.comparator

Pour en savoir plus sur les raisons pour lesquelles les types bruts posent problème pour Scala, consultez ce bug http://lampsvn.epfl.ch/trac/scala/ticket/1737 .Ce bogue a une solution de contournement utilisant des types existentiels qui ne fonctionneront probablement pas dans ce cas particulier, du moins pas sans beaucoup de casting, car le paramètre de type java.util.List est dans les positions de variantes co et contra.

Autres conseils

En regardant le javadoc, l'argument du constructeur n'est pas paramétré.

J'essaierais ceci :

val list = new java.util.ArrayList[_]
val obsList = new ObservableList(list, null) {}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top