項目開發中爲了減少重複代碼,常常會使用到Java泛型。有時候就需要求泛型的類型。
GenericFoo.java是基類
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
/**
* Created by li on 2015/10/31.
*/
public abstract class GenericFoo<T> {
protected Logger logger = LoggerFactory.getLogger(this.getClass());
private Class<T> beanClass;
public Class<T> getBeanClass(){
logger.debug("this: " + this.getClass() + "\t Super: " + getClass().getGenericSuperclass());
Type type =getClass().getGenericSuperclass();
// if (!ParameterizedType.class.isAssignableFrom(type.getClass())) {
// return null;
// }
ParameterizedType paraType = (ParameterizedType)getClass().getGenericSuperclass();
logger.debug(type.toString());
beanClass = (Class<T>) paraType.getActualTypeArguments()[0];
logger.debug("beanClass: " + beanClass);
return this.beanClass;
}
}
GenericFooChild.java是子類
public class GenericFooChild<T> extends GenericFoo {
}
編寫Junit測試類
import com.cqs.models.user.model.User;
import org.junit.Test;
/**
* Created by li on 2015/10/31.
*/
public class GenericFooChildTest {
private GenericFooChild child = new GenericFooChild();
@Test
public void testGetBeanClass() throws Exception {
child.getBeanClass();
}
}
查了一些帖子:子類(GenericFooChild)在集成父類(GenericFoo)時不能還寫抽象類,需要傳入具體的類別
所以:
需要將GenericFooChild修改爲:
import com.cqs.models.user.model.User;
/**
* Created by li on 2015/10/31.
*/
public class GenericFooChild extends GenericFoo<User> {
}
運行結果
還有一個一種辦法可以求泛型的類型:
在構造器中,傳入具體的泛型類型:
父類修改爲【添加含參構造函數,getBeanClass()可以直接返回beanClass】:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Created by li on 2015/10/31.
*/
public abstract class GenericFoo<T> {
protected Logger logger = LoggerFactory.getLogger(this.getClass());
private Class<T> beanClass;
public GenericFoo(Class<T> beanClass) {
this.beanClass = beanClass;
}
public Class<T> getBeanClass(){
logger.debug("beanClass: " + beanClass);
return this.beanClass;
}
}
子類和JUnit測試類,也要相應的修改
import com.cqs.models.user.model.User;
/**
* Created by li on 2015/10/31.
*/
public class GenericFooChild extends GenericFoo<User> {
public GenericFooChild(Class<User> beanClass) {
super(beanClass);
}
}
import com.cqs.models.user.model.User;
import org.junit.Test;
/**
* Created by li on 2015/10/31.
*/
public class GenericFooChildTest {
private GenericFooChild child = new GenericFooChild(User.class);
@Test
public void testGetBeanClass() throws Exception {
child.getBeanClass();
}
}
運行結果: