Deux options pour le type d'exécution de vérification avec les génériques:
Option 1 - Corrupt votre constructeur
Supposons que vous surchargez indexOf (...), et que vous voulez vérifiez le type juste pour la performance, pour vous épargner itérer toute la collection.
Faire un constructeur crasseux comme ceci:
public MyCollection<T>(Class<T> t) {
this.t = t;
}
Ensuite, vous pouvez utiliser isAssignableFrom pour vérifier le type.
public int indexOf(Object o) {
if (
o != null &&
!t.isAssignableFrom(o.getClass())
) return -1;
//...
Chaque fois que vous instancier votre objet que vous auriez à vous répéter:
new MyCollection<Apples>(Apples.class);
Vous pouvez décider ce n'est pas la peine. Dans l'implémentation de ArrayList.indexOf(...), ils ne vérifient pas que le type correspond.
Option 2 - Laissez échouer
Si vous avez besoin d'utiliser une méthode abstraite qui nécessite votre type inconnu, tout ce que vous voulez vraiment est pour le compilateur pour arrêter de pleurer sur les instanceof. Si vous avez une méthode comme ceci:
protected abstract void abstractMethod(T element);
Vous pouvez l'utiliser comme ceci:
public int indexOf(Object o) {
try {
abstractMethod((T) o);
} catch (ClassCastException e) {
//...
Vous caster l'objet à T (votre type générique), juste pour tromper le compilateur. Your cast does nothing at runtime, mais vous obtiendrez toujours une exception ClassCastException lorsque vous essayez de transmettre le mauvais type d'objet dans votre méthode abstraite.
REMARQUE 1: Si vous effectuez des conversions supplémentaires non contrôlées dans votre méthode abstraite, vos exceptions ClassCast seront interceptées ici. Cela pourrait être bon ou mauvais, alors réfléchissez-y.
NOTE 2: You get a free null check when you use instanceof. Puisque vous ne pouvez pas l'utiliser, vous devrez peut-être vérifier null avec vos mains nues.
Je ne pense pas que vous voulez 'Class.isAssignableFrom'. –
@Tom, j'ai écrit cette nuit dernière de mémoire, et je l'ai réparé pour effectivement passer la classe (duh!) Mais sinon, je ne comprends pas pourquoi vous ne le voudriez pas (peut-être que j'ai besoin de plus de café ce matin, suis seulement sur ma première tasse). – Yishai
Je suis avec Tom. Pourriez-vous clarifier cela? Utiliser isAssignableFrom() aurait été mon choix pour le travail. Peut-être qu'il me manque quelque chose? –