如何获得java 泛型类中T的实例?

publicclassBase<T>{ClassclassType=null;publicBase(){//想在这里得到T的类对象赋值给classType}publicB... public class Base<T>{
Class classType=null;
public Base(){
//想在这里 得到T的类对象 赋值给 classType
}
public Base(Class classType){
//以前用这种方法 但写代码的时候很类
this.classType=classType;
}

}
展开
 我来答
pe...n@sina.com
推荐于2018-02-28 · TA获得超过893个赞
知道小有建树答主
回答量:189
采纳率:0%
帮助的人:227万
展开全部
T.getClass()或者T.class都是非法的,因为T是泛型变量。
由于一个类的类型是什么是在编译期处理的,故不能在运行时直接在Base里得到T的实际类型。
有一种变通的实现方式:
import java.lang.reflect.Array;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public class Generic extends Base<String> {
public static void main(String[] args) {
Generic c = new Generic();
System.out.println(c.array);
}

Object array ;
public Generic() {
array = Array.newInstance(getGenericType(0), 100);
}
}

class Base<T> {
public Class getGenericType(int index) {
Type genType = getClass().getGenericSuperclass();
if (!(genType instanceof ParameterizedType)) {
return Object.class;
}
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
if (index >= params.length || index < 0) {
throw new RuntimeException("Index outof bounds");
}
if (!(params[index] instanceof Class)) {
return Object.class;
}
return (Class) params[index];
}
}
其中Base<T>是泛型类,在父类中声明getGenericType,子类继承具体的Base<String>,那么在子类中就可以通过getGenericType(0)获取到String的class.
百度网友581c622
2015-05-22 · TA获得超过4379个赞
知道大有可为答主
回答量:1826
采纳率:0%
帮助的人:1362万
展开全部
Java与C++不同,如果你在放进一个类以后想用new T()来创建一个实例,Java是无法实现的。这是因为Java有擦除机制,而且编译器不能验证T具有默认(无参)构造器。
解决方案是传递一个工厂对象,并且使用它来创建新的实例。最便利的工厂对象就是Class对象,因此如果使用类型标签,那么你就可以使用newInstance来创建这个类型的新对象。
具体查看Bruce.Eckel著《Java编程思想(第四版)》的383页。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
flsfycy
推荐于2016-12-06 · TA获得超过729个赞
知道小有建树答主
回答量:1002
采纳率:0%
帮助的人:714万
展开全部
c#中可以,但是java中貌似不行
java中需要实例化某个类的实例,需要知道类名称
Class.forName("xxx.xx.MyClass").newInstance()
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
午夜不眠的小狗
2010-04-29 · 超过10用户采纳过TA的回答
知道答主
回答量:128
采纳率:0%
帮助的人:46.1万
展开全部
public class Base<T>{
Class classType=T.class;
public Base(){
//想在这里 得到T的类对象 赋值给 classType
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
记忆邮心
2010-04-29 · 超过12用户采纳过TA的回答
知道答主
回答量:25
采纳率:0%
帮助的人:35.6万
展开全部
T.getClass()或 T.class,或class.forName(T.getClass().getName())
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式