2010-06-24 5 views
3

deux classes:type entier refrence valeur de type String

public class BaseDo<K> { 
    protected K id; 

    public K getId() { 
     return id; 
    } 

    public void setId(K id) { 
     this.id = id; 
    } 
} 


public class BeanDo extends BaseDo<Integer> { 
    private String beanName; 

    public String getBeanName() { 
     return beanName; 
    } 

    public void setBeanName(String beanName) { 
     this.beanName = beanName; 
    } 
} 

Je veux réfléchir à utiliser implment comme ceci:

BeanDo beanDo = new BeanDo(); 
beanDo.setId("string here"); 

référence type Integer valeur de type String. qui peut m'aider?

+4

Pourquoi diable voudriez-vous faire cela? – SLaks

+0

Donc, vous voulez être en mesure de définir un entier à une chaîne? Pourquoi ne pas étendre 'BaseDo '? –

+0

@SLasks, il me vient à l'esprit que pour un morceau de code existant il a une instance concrète de 'BeanDo' et que la seule chose qu'il a comme id est une chaîne. Probablement, parce que c'était un int, mais quelqu'un a pensé que ce serait amusant s'ils ajoutaient un identificateur supplémentaire dans la chaîne: '12345-N' (N pour normal) ... OMG Je pense que je l'ai traversé dans le passé ...: -S: -S – OscarRyz

Répondre

0

Quelque chose comme ça?

public class BaseDo<K> { 

    protected K id; 

    public K getId() { 
    return id; 
    } 

    public void setId(K id) { 
    this.id = id; 
    } 

} 

public class BeanDo extends BaseDo<Integer> { 

    private String beanName; 

    public void setId(String id) { 
    setId(Integer.parseInt(id)); 
    } 

    public String getBeanName() { 
    return beanName; 
    } 

    public void setBeanName(String beanName) { 
    this.beanName = beanName; 
    } 

} 

Maintenant, vous pouvez utiliser quelque chose comme ceci:

BeanDo beanDo = new BeanDo(); 
beanDo.setId("2"); 
+0

-1 essayez-le avec: 'beanDo.setId (" chaîne ici ");' Using 'someString.hashCode()' est tout ce qui est nécessaire, voir ma réponse. – OscarRyz

+0

@rmarimon Laissez-moi au moins un commentaire sur votre downvote. – OscarRyz

0

Qu'en est-ce:

BeanDo beando = new BeanDo(); 
beando.setId("string there".hashCode()); 

Je ne comprends pas tout à fait ce que vous entendez par « Je veux utiliser réfléchir pour implémenter cette " cependant.

Je suppose que vous voulez quelque chose comme ceci:

BeanDo doer = ... // get it from somewhere 
    String id = ... // get it from somewhere else too. 

    // and you want to set id to the doer bean. 
    reflectionMagicSetId(doer, id); 

et ont la méthode comme:

private void reflectionMagicSetId(BandDo doer, String id) { 
     /// do some magic here? 
} 

Si c'est ce que vous voulez, ce que je vous donne fonctionne parfaitement.

private void reflectionMagicSetId(BandDo doer, String id) { 
    doer.setId(id == null ? 0 : id.hashCode() ); 
} 
+0

Il ne semble pas correct d'utiliser String.hashCode() car plusieurs chaînes peuvent produire la même valeur de hachage. Cela ne fonctionnerait pas si elle était utilisée comme clé primaire dans une base de données, par exemple. Peut-être que tidus2005 veut faire une clé composée avec un entier et une chaîne? Impossible de savoir à partir de la question. –

+0

Bon point je suppose que la seule ressource restante serait de sous-classer – OscarRyz

0

Si vous wann entier use Parse alors la chaîne en entier car il contiendra l'entier et l'utiliser entier dans l'argument de la fonction d'appel

1

Generics en Java ne sont pas utilisés lors de l'exécution, de sorte que dans la mesure le runtime java est concerné vous êtes le champ ID est de type Object et peut donc être mis à n'importe quelle valeur indépendamment des génériques. Cela dit, le faire est une mauvaise idée puisque tout ce qui suppose que le contrat générique échouera.

Vous pouvez définir le champ par la réflexion comme suit:

BeanDo beanDo = new BeanDo(); 
Method method = BeanDo.getClass().getMethod("setId", Object.class); 
method.invoke(beanDo, "SomeRandomString"); 

Cela dit, le faire est une idée extreamly mauvais parce que tout code de compilation contre BeanDo supposerons que l'id est un entier non d'une chaîne. Par conséquent, tout code tel que beanDo.getId() échouera avec une exception de conversion de classe, car il ne s'agit pas réellement d'un entier.

Comme les autres affiches, je suis un peu dans l'ignorance de ce que vous essayez d'accomplir.

+0

Je suis d'accord avec cela - juste parce que vous ne pouvez pas dire que vous ne devriez pas. Si vous n'avez pas accès à chaque endroit, getId() est appelé, vous ne pouvez pas garantir que vous ne vous installerez pas pour des problèmes plus tard. Si vous avez accès à toutes les utilisations, vous devez juste changer l'objet pour utiliser une chaîne explicitement. – Curtis

0

Cela ressemble à une sous-classe sur la seule façon de pouvoir définir une chaîne, tout en garantissant que toute personne qui appelle déjà getId() obtient l'entier attendu. Quelque chose comme ceci:

 
public class StringBeanDo extends BeanDo { 
    private String stringId; 

    public String getStringId() 
    { 
    return stringId; 
    } 

    public void setId(Integer val) 
    { 
    super.setId(val); 
    stringId = Integer.toString(val); 
    } 

    public void setId(String str) 
    { 
    stringId = str; 
    super.setId(convertStringToInteger(str)); // Do this however you like. 
    } 
} 

La mise en œuvre de convertStringToInteger serait à vous (cela dépendra de ce que cet ID est utilisé pour). La clé ici est que vous maintenez deux IDs, et les gardez synchronisés, de sorte que le code plus ancien peut encore fléchir dans une certaine mesure.

Questions connexes