Dynamique de la coulée en Java

Avant de me reproche de ne pas faire mes devoirs, j'ai été incapable de trouver des indices sur la multitude de questions sur Java génériques et de la dynamique de la coulée.

Le type Scalaire est défini comme suit:

public class Scalar <T extends Number> {

  public final String name;

  T value;

  ... 

  public T getValue() {
    return value;
  }

  public void setValue(T val) {
    this.value = val;      
  }

}

Je voudrais avoir une méthode qui ressemble à ceci:

public void evilSetter(V val) {
  this.value = (T) val;
}

Sûr, c'est généralement déconseillée. La raison pour laquelle je tiens une telle méthode est parce que j'ai une collection de Scalaires dont les valeurs que j'aimerais changer plus tard. Cependant, une fois qu'ils vont dans la collection, leurs paramètres de type générique ne sont plus accessibles. Donc, même si je veux faire une affectation qui est parfaitement valide au moment de l'exécution, il n'y a aucun moyen de savoir que ça va être valide au moment de la compilation, avec ou sans les génériques.

Map<String, Scalar<? extends Number>> scalars = ...;

Scalar<? extends Number> scalar = scalars.get("someId");

//None of this can work
scalar.value = ...
scalar.setValue(...)

Alors, comment puis-je mettre en œuvre un contrôle de fonte et la méthode de jeu?

public <V extends Number> void castAndSet(V val) {
    //One possibility
    if (this.value.getClass().isAssignableFrom(val.getClass()) {
       //Some cast code here
    }
    //Another
    if (this.value.getClass().isInstanceOf(val) {
       //Some cast code here    
    }
    //What should the cast line be?
    //It can't be:
    this.value = this.value.getClass().cast(val);
    //Because this.value.getClass() is of type Class<?>, not Class<T>        

}

Donc je suis parti avec l'aide de

this.value = (T) val;

et attraper une ClassCastException?

Vous pourriez peut-être laisser de côté les génériques entièrement? Pourquoi ne pas simplement utiliser le Numéro au lieu de T?
Dans ma frustration, j'ai été tenté de le faire, mais j'aimerais quitter l'établissement pour, disons, un RichScalar qui est des unités.

OriginalL'auteur dgorur | 2010-10-15