Non, ce n'est pas un bug du jdk, c'est une erreur dans ton code.
Quand tu fais :
1 2 3
| public abstract interface Coord<_Number extends Number> {
public abstract Coord<_Number> getDiffFrom(Coord<_Number> c);
} |
Ça peut se réécrire de manière lisible comme ça, c'est la même chose :
1 2 3
| public abstract interface Coord<N extends Number> {
public abstract Coord<N> getDiffFrom(Coord<N> c);
} |
On voit que la getDiffFrom() nécessite en paramètre un objet Coord dont le paramétrage est N, c'est-à-dire le même que celui de la classe en cours. En gros, les objets Coord doivent appeler getDiffFrom() sur d'autres objets Coord, dont le typage paramétré doit être le même.
Quand tu fais
public class Vector< _Coord extends Coord<?>> {
qu'on peut réécrire lisiblement
public class Vector<C extends Coord<?>> {
Ça veut dire que le paramètre C est garanti d'être un sous-type de Coord<?>. C'est-à-dire de Coord, dont on ne sait pas trop quel est le paramétrage.
Du coup, avec
1 2
| private C m_A;
private C m_B; |
Tu te retrouves avec deux variables, dont chacune a un type Coord<?>, c'est-à-dire chacune Coord dont on ne sait pas trop quel est le paramétrage.
Et donc, notamment puisqu'on sait pas trop ce que c'est, on n'a aucune raison de penser que c'est le même paramétrage.
Pas le même paramétrage => on peut pas appeler getDiffFrom() l'un sur l'autre, qui exige le même paramétrage.
Partager