2009-12-30 8 views
1
@Entity 
    @Table(name = "your_entity") 
    public class YourEntityClass implements IEntity<Long> { 

     @Id 
     @SequenceGenerator(name = "gen_test_entity2_id", sequenceName = "test_entity2_id_seq", allocationSize = 10) 
     @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "gen_test_entity2_id") 
     private Long id; 

     @Column(name = "name", nullable = false, length = 64) 
     private String name; 

     /* 
     * Create constructors, getters, setters, isEquals, hashcode, etc. 
     */ 
    } 

public interface IEntity<I extends Serializable> extends Serializable { 

    /** 
    * Property which represents id. 
    */ 
    String P_ID = "id"; 

    /** 
    * Get primary key. 
    * 
    * @return primary key 
    */ 
    I getId(); 

    /** 
    * Set primary key. 
    * 
    * @param id primary key 
    */ 
    void setId(I id); 
} 

Pour le code ci-dessus, ma question est, pourquoi YourEntityClass besoin de passer à LongIEntity<Long>? Pourquoi pas autre chose comme IEntity<String>? Est-ce parce que le id est de type Long, et le getter de id doit renvoyer le même type que celui que nous avons fourni à IEntity?Comprendre Generics

Répondre

4

YourEntityClass met <Long> dans IEntity arbitrairement. Tout type qui implémente Serializable peut y aller.

Une fois que vous avez choisi le type I, votre méthode getId() doit renvoyer le même type. Par exemple, vous pourriez avoir une autre classe qui implémente IEntity<String> et getId() dans ce cas devrait renvoyer String.

+0

+1 pour donner un second exemple. –

+0

compris très clairement =) – cometta

0

YourEntityClass implémente une interface générique et spécifie le type spécifique pour l'interface générique. Il a une méthode utilisant un type spécifique (Long) puisque c'est ce que l'implémentation de cette interface implique.