2017-10-14 60 views
1

我有一个这样的接口:如何自定义泛型?

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

我想定制它:

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; 
    } 
} 

因为这两个@SuppressWarnings的,我觉得不舒服。

我应该怎么做才能解决它?

谢谢!

回答

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

变化从

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

的东西签名(和执行)像

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

正如Elliott Frisch说,你将要实现BeanCreator<CustomizedBean>,而不是仅仅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; 
} 

这段代码,你说你可以返回类型T,但你永远不说,T是CustomizedBean,所以编译器不能确保bean将是T型的,这样的情况是不是安全

对于例如,你可以要求一个CustomizedBeanCreator<String>的实例,编译器会希望createBean()返回一个String,并且试图将一个CustomizedBean强制转换为String将导致ClassCastException。