2017-10-14 109 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。