2011-07-24 4 views
2

Je veux implémenter une sorte de modèle d'objet de transfert. Donc, j'ai une méthode qui remplit les propriétés de l'objet via BeanUtils.copyProperties (.., ..) (apache common).java générique cast question

Voici le code:

public abstract class BaseTO<TObject> { 

    public Long id; 

    /*** 
    * Obtains id of the object that´s transfered 
    * @return object´s id 
    */ 
    public Long getId() { 
     return id; 
    } 

    /**** 
    * set transfered object´s id 
    * @param id object´s id 
    */ 
    public void setId(Long id) { 
     this.id = id; 
    } 

    /*** 
    * Fill transfer object properties. 
    * @param entity entity to be transfered 
    * @return self reference 
    */ 
    public BaseTO<TObject> build(TObject entity){ 
     try { 
      BeanUtils.copyProperties(this, entity); 
     } catch (IllegalAccessException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     customDataTransformation(entity); 
     return this; 
    } 

    protected void customDataTransformation(TObject entity) { 
    } 


} 

CustomerTO Classe

public class CustomerTO extends BaseTO<Customer> { 

    private String name; 
    private String surname; 
    private String email; 
    private String sex; 
    private DocumentType documentType; 
    private String documentNumber; 

    --- getters and setters 

    @Override 
    protected void customDataTransformation(Customer entity) { 
     this.sex = Sex.MALE.equals(entity.getSex()) ? "M" : "F"; 
    } 


} 

le problème

CustomerTO toEdit = (CustomerTO) (customerId!=null ? new CustomerTO().build(entityObject):new CustomerTO()); 

comme vous pouvez le voir ici doivent jeter à (CustomerTO). Je veux si c'est possible éviter cela, pour rendre le code plus simple.

Est-il possible que public BaseTO build (entité TObject) peut renvoyer l'objet de la sous-classe?

J'espère être clair.

Merci d'avance.

+0

Avez-vous écrit tout cela juste parce que vous voulez passer 1 petite distribution? – toto2

+0

@toto: Je pense que la question n'est pas seulement une question de casting, mais aussi une question de vérification de type à la compilation. +1 à la question –

+0

@toto. Non, je vais utiliser dans beaucoup d'endroits. –

Répondre

1

Peut-être essayer ceci:

class BaseTO<TObject, R extends BaseTO<TObject,R>> { 

    public R build(TObject entity) { 

puis CustomerTO:

class CustomerTO extends BaseTO<Customer, CustomerTO> { 

ou moins restrictivement, modifiez seule la signature build:

public <X extends BaseTO<TObject>> X build(TObject entity) { 

Mais à mon humble avis une meilleure approche sera tout simplement ajouter un constructeur à TO avec le paramètre TObject.

public BaseTO(TObject entity) { 
     try { 
      BeanUtils.copyProperties(this, entity); 
     } catch (IllegalAccessException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     customDataTransformation(entity); 
} 

puis dans chaque classe extension créer simple constructeur

 public CustomerTO(Customer entity) { 
     super(entity); 
    } 

et oublier la méthode build et l'utiliser simplement

CustomerTO toEdit = (customerId!=null ? new CustomerTO(entityObject):new CustomerTO()); 
+0

je vais utiliser votre dernier env. –

1

Cette compile:

public class BaseTO<T> { 

    public BaseTO<T> build(T entity) { 
     return this; 
    } 

    public static class CustomerTO extends BaseTO<String> { 

     @Override public CustomerTO build(String string) { 
      return (CustomerTO) super.build(string); 
     } 
} 

mais toi devra remplacer build pour toutes les sous-classes de BaseTO. Vous écrivez explicitement la distribution une seule fois au lieu de chaque fois que vous appelez build.

EDIT: voir le point soulevé par @Paul dans les commentaires ci-dessus. Vous pourriez souffrir de «donner à un homme un marteau et tout lui ressemble comme un clou».