J'ai donc un code qui ressemble à peu près à ceci (tronqué par souci de concision - ne pas tenir compte des variables membres publiques) :
public class GenericThingy<T> {
private T mValue;
public final T[] mCandidates;
public GenericThingy(T[] pCandidates, T pInitValue) {
mCandidates = pCandidates;
mValue = pInitValue;
}
public void setValue(T pNewValue) {
mValue = pNewValue;
}
}
public class GenericThingyWidget {
private final GenericThingy<?> mThingy;
private final JComboBox mBox;
public GenericThingyWidget (GenericThingy<?> pThingy) {
mThingy = pThingy;
mBox = new JComboBox(pThingy.mCandidates);
//do stuff here that makes the box show up
}
//this gets called by an external event
public void applySelectedValue () {
mThingy.setValue(mBox.getSelectedItem());
}
}
}
Mon problème est que l'appel mThingy.setValue(mBox.getSelectedItem()) ; génère l'erreur suivante :
La méthode setValue(capture#4-of ?)
dans le type Generics.GenericThingy<capture#4-of ?>
n'est pas applicable aux arguments (Objet)
Je peux contourner ce problème en supprimant le <?>
de la déclaration de mThingy et pThingy dans GenericThingyWidget - ce qui me donne un "GenericThingy is a raw type. Les références à GenericThingy doivent être paramétrées".
J'ai également essayé de remplacer l'appel à setValue par
mThingy.setValue(mThingy.mCandidates[mBox.getSelectedIndex()]);
dont je m'attendais vraiment à ce qu'elle fonctionne, mais qui a produit une erreur très similaire :
La méthode setValue(capture#4-of ?)
dans le type Generics.GenericThingy<capture#4-of ?>
n'est pas applicable aux arguments (capture#5-of ?)
Existe-t-il un moyen de le faire ? sans en générant des avertissements "raw type" (je suis d'accord avec les avertissements "unchecked cast") et sans faire de GenericThingyWidget un type générique ? J'aurais pensé que je pouvais convertir le retour de mBox.getSelectedItem() en quelque chose, mais je n'arrive pas à trouver ce que cela pourrait être.
En prime, pourquoi l'appel de remplacement à mThingy.setValue ne fonctionne-t-il pas ?