如何获得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;
}
} 展开
Class classType=null;
public Base(){
//想在这里 得到T的类对象 赋值给 classType
}
public Base(Class classType){
//以前用这种方法 但写代码的时候很类
this.classType=classType;
}
} 展开
展开全部
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.
由于一个类的类型是什么是在编译期处理的,故不能在运行时直接在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.
展开全部
Java与C++不同,如果你在放进一个类以后想用new T()来创建一个实例,Java是无法实现的。这是因为Java有擦除机制,而且编译器不能验证T具有默认(无参)构造器。
解决方案是传递一个工厂对象,并且使用它来创建新的实例。最便利的工厂对象就是Class对象,因此如果使用类型标签,那么你就可以使用newInstance来创建这个类型的新对象。
具体查看Bruce.Eckel著《Java编程思想(第四版)》的383页。
解决方案是传递一个工厂对象,并且使用它来创建新的实例。最便利的工厂对象就是Class对象,因此如果使用类型标签,那么你就可以使用newInstance来创建这个类型的新对象。
具体查看Bruce.Eckel著《Java编程思想(第四版)》的383页。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
c#中可以,但是java中貌似不行
java中需要实例化某个类的实例,需要知道类名称
Class.forName("xxx.xx.MyClass").newInstance()
java中需要实例化某个类的实例,需要知道类名称
Class.forName("xxx.xx.MyClass").newInstance()
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
public class Base<T>{
Class classType=T.class;
public Base(){
//想在这里 得到T的类对象 赋值给 classType
}
Class classType=T.class;
public Base(){
//想在这里 得到T的类对象 赋值给 classType
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
T.getClass()或 T.class,或class.forName(T.getClass().getName())
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询