项目开发中为了减少重复代码,常常会使用到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();
}
}
运行结果: