Maintenant Eclipse Indigo SR1 avec une fonction intégrée Java 7 Le support est enfin sorti depuis une semaine ou deux, je suis en train de migrer mes projets de playground de Helios SR2 + JDK 1.6_23 vers Indigo SR1 + JDK 1.7.0. Après une reconstruction complète de tous les projets, une seule classe n'a pas réussi à compiler. Il s'agit de la classe suivante qui compile et fonctionne parfaitement bien sous Java 1.6 (et 1.5) :
public abstract class Area<A extends Area<?>> implements Comparable<Area<?>> {
private String name;
private Area<?> parent;
private Set<A> areas;
protected Area(String name, A... areas) {
this.name = name;
this.areas = new TreeSet<A>();
for (A area : areas) {
area.parent = this;
this.areas.add(area);
}
}
public Set<A> getAreas() {
return areas;
}
// ...
}
La ligne area.parent = this;
échoue avec l'erreur suivante sur parent
:
Le champ Area<capture#1-of ?>.parent n'est pas visible.
Après avoir d'abord soupçonné le compilateur Eclipse, j'ai essayé avec le simple javac
à partir du JDK 1.7.0, mais il donne fondamentalement la même erreur alors que l'option javac
à partir du JDK 1.6.0_23 réussit sans erreur.
Changer la visibilité en protected
ou par défaut résout le problème. Mais le pourquoi me dépasse complètement. J'ai jeté un coup d'oeil sur http://bugs.sun.com mais je n'ai pas trouvé de rapport similaire.
Une autre façon de corriger l'erreur de compilation est de remplacer toutes les données utilisées par A
à l'intérieur de la classe par Area<?>
(ou de le supprimer complètement) :
public abstract class Area<A extends Area<?>> implements Comparable<Area<?>> {
private String name;
private Area<?> parent;
private Set<Area<?>> areas;
protected Area(String name, Area<?>... areas) {
this.name = name;
this.areas = new TreeSet<Area<?>>();
for (Area<?> area : areas) {
area.parent = this;
this.areas.add(area);
}
}
public Set<Area<?>> getAreas() {
return areas;
}
// ...
}
Mais cela brise l'objectif du getter. Dans le cas par exemple de la classe suivante :
public class Country extends Area<City> {
public Country(String name, City... cities) {
super(name, cities);
}
}
Je m'attendrais à ce qu'il revienne Set<City>
pas Set<Area<?>>
.
Quel changement dans Java 7 a fait que ces champs paramétrés par type deviennent invisibles ?