2017-10-14 22 views
1

J'ai une interface comme ceci:Comment personnaliser un type générique?

public interface BeanCreator<T> { 
    public T createBean(); 
    public Class<T> getClazz(); 
} 

Et j'ai essayé de mesure il:

public class CustomizedBeanCreator<T> implements BeanCreator<T>{ 

    @Override 
    public T createBean() { 
     CustomizedBean bean = new CustomizedBean(); 
     bean.setId(-2323); 
     bean.setName("this bean is created by a customized creator");  
     @SuppressWarnings("unchecked") 
     T t = (T)bean;  
     return t; 
    } 

    @SuppressWarnings("unchecked") 
    @Override 
    public Class<T> getClazz() { 
     return (Class<T>) CustomizedBean.class; 
    } 
} 

En raison de ces deux @SuppressWarnings, je me sens mal à l'aise.

Que dois-je faire pour le réparer?

Merci!

Répondre

2
public class CustomizedBeanCreator implements BeanCreator<CustomizedBean> { 
    @Override 
    public CustomizedBean createBean() { 
     CustomizedBean bean = new CustomizedBean(); 
     bean.setId(-2323); 
     bean.setName("this bean is created by a customized creator");  
     return bean; 
    } 

    @Override 
    public Class<CustomizedBean> getClazz() { 
     return CustomizedBean.class; 
    } 
} 
5

Modifier la signature (et la mise en œuvre) de

public class CustomizedBeanCreator<T> implements BeanCreator<T>{ 

à quelque chose comme

public static class CustomizedBeanCreator implements BeanCreator<CustomizedBean> { 

    @Override 
    public CustomizedBean createBean() { 
     CustomizedBean bean = new CustomizedBean(); 
     bean.setId(-2323); 
     bean.setName("this bean is created by a customized creator"); 
     return bean; 
    } 

    @Override 
    public Class<CustomizedBean> getClazz() { 
     return CustomizedBean.class; 
    } 
} 
2

Comme dit Elliott Frisch, vous voulez mettre en œuvre BeanCreator<CustomizedBean> au lieu de simplement BeanCreator<T>, la raison est ce qui suit:

@Override 
public T createBean() { 
    CustomizedBean bean = new CustomizedBean(); 
    bean.setId(-2323); 
    bean.setName("this bean is created by a customized creator");  
    @SuppressWarnings("unchecked") 
    T t = (T)bean;  
    return t; 
} 

Dans ce code, vous dites que vous pouvez renvoyer le type T, mais vous dites jamais que T est CustomizedBean, de sorte que le compilateur ne peut pas être sûr que le haricot sera de type T, de sorte que le cas n'est pas sûr

Pour Par exemple, vous pourriez demander une instance de CustomizedBeanCreator<String>, et le compilateur s'attendrait à ce que createBean() renvoie une chaîne, et essayer d'envoyer un CustomizedBean à une chaîne provoquerait une exception ClassCastException.