2010-06-05 6 views
0

J'ai construit un dataconteneur générique et maintenant je veux manipuler les données en fonction de leur type. Cependant, je reçois un avertissement de types incompatibles. Qu'est-ce que je fais mal?Conversion de génériques Java

Type _Value; 
public void set(Type t) throws Exception { 
    if (_Value instanceof Integer 
    && t instanceof Integer) { 
     _Value = (((Integer) t 
     - _MinValue + getRange()) 
      % getRange()) + _MinValue; 
     } 
     else if (_Value instanceof Boolean 
     && t instanceof Boolean) { 
_Value = t; 
      } 
     else throw new Exception("Invalid type"); 
    } 
+0

Montre comment la classe est définie et comment l'instance est construite. –

Répondre

2

Vous ne respectez pas les normes de codage Sun Java, par exemple. Les noms de variables doivent commencer par une lettre minuscule. Mon goût personnel dirait de perdre ce trait de soulignement. Si vous devez épeler qu'une variable est un membre de classe, utilisez "this". Les IDE sont assez intelligents pour les afficher. Cette ancienne convention C++ de dénoter des variables membres de classe avec un trait de soulignement principal pourrait être une bonne idée quand tout ce que vous avez est un éditeur de texte qui ne peut pas faire de surlignage de texte, mais ce n'est pas le cas aujourd'hui. En ce qui concerne vos constructions "instanceof", cela va à l'encontre de tous les principes orientés objet.

Vous ne pouvez pas intégrer des opérations dépendantes du type dans le conteneur lui-même. Mon conseil serait d'écrire le conteneur et d'externaliser les opérations sur les éléments qu'il contient dans un Iterator, un Functor ou un Visitor quelconque. Vous pouvez utiliser le type générique pour spécifier le type sans devoir recourir à "instanceof".

C'est une conception beaucoup plus propre: pas de "instanceof" et une séparation appropriée des préoccupations.

0

Si Type est java.reflect.Type, il ne peut jamais être un entier ou un booléen. C'est juste une interface pour les objets qui contiennent des informations sur les types, classes, interfaces, ils ne sont pas réellement des objets de ce type, classe, interface. Et vous devriez recevoir des erreurs, pas des avertissements. Peut-être que vous devriez utiliser Object au lieu de Type, ou essayez-vous de faire quelque chose de manière réfléchie?