如何获得java 泛型类中T的实例?
答案:6 悬赏:10 手机版
解决时间 2021-03-10 14:12
- 提问者网友:别再叽里呱啦
- 2021-03-10 00:05
如何获得java 泛型类中T的实例?
最佳答案
- 五星知识达人网友:千杯敬自由
- 2021-03-10 01:06
c#中可以,但是java中貌似不行
java中需要实例化某个类的实例,需要知道类名称
Class.forName("xxx.xx.MyClass").newInstance()
java中需要实例化某个类的实例,需要知道类名称
Class.forName("xxx.xx.MyClass").newInstance()
全部回答
- 1楼网友:西风乍起
- 2021-03-10 04:22
T.getClass()或 T.class,或class.forName(T.getClass().getName())
- 2楼网友:污到你湿
- 2021-03-10 04:09
public Base(){
Class classType = Base.class;
}
Class classType = Base.class;
}
- 3楼网友:患得患失的劫
- 2021-03-10 04:00
public class Base{
Class classType=T.class;
public Base(){
//想在这里 得到T的类对象 赋值给 classType
}
Class classType=T.class;
public Base(){
//想在这里 得到T的类对象 赋值给 classType
}
- 4楼网友:七十二街
- 2021-03-10 03:15
Java与C++不同,如果你在放进一个类以后想用new T()来创建一个实例,Java是无法实现的。这是因为Java有擦除机制,而且编译器不能验证T具有默认(无参)构造器。
解决方案是传递一个工厂对象,并且使用它来创建新的实例。最便利的工厂对象就是Class对象,因此如果使用类型标签,那么你就可以使用newInstance来创建这个类型的新对象。
具体查看Bruce.Eckel著《Java编程思想(第四版)》的383页。
解决方案是传递一个工厂对象,并且使用它来创建新的实例。最便利的工厂对象就是Class对象,因此如果使用类型标签,那么你就可以使用newInstance来创建这个类型的新对象。
具体查看Bruce.Eckel著《Java编程思想(第四版)》的383页。
- 5楼网友:天凉才是好个秋
- 2021-03-10 01:48
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 {
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 {
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是泛型类,在父类中声明getGenericType,子类继承具体的Base,那么在子类中就可以通过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
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
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
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯