java,关于利用反射自动设置List中T的类型泛型应用。
用 类名.class 可以得到一个 Class对象
class.newInstance() 可以得到一个实体
现在我想要一个方法
可以根据 Class指定的类型,生成一个 List list 集合
问题是怎么让程序自动指定 这个”T” ?
或者根本没有必要 指定 T ?
分享到:
2012-03-27 20:04 天天爱答题,20元话费等你拿~提问者采纳
由于return 无法返回“数据类型”这种模糊的对象,所以无法通过“方法”达到你的目的。
但是你可以通过判断已知的数据类型或者采用超类来达到相同的目的。
判断已知数据类型可以使用关键字 instanceof :
if(str instanceof String){
List list = null;
}
采用超类:
List list = null;
List> list = null; 使用“?”与使用Object达到的结果相同。
如果使用超类的话,在使用集合元素前最好先判断(instanceof)在进行强制类型转换,否则可能会出错。
追问
str instanceof String
这种形式倒是很容易,但是我想让方法更”自由一点”,不要太死
请问用超类的方法怎么用?可以给个例子吗?
回答
用代码给你例子:
import java.util.*;
public class A{
List list = null;
static int b;
int a = 0;
private A(){ //这虽然是使用了private声明的构造函数
//但是在使用newInstance()方法时调用的是这个构造函数
//如果类中声明了其他构造函数且没有默认构造函数的话,会出错。
//你可以试一下注释掉这个构造函数。
a+=b++;
}
public A(Object o){ //与前一个构造函数作对比。
a-=b++;
}
List getList(Object o){
List list = new ArrayList();
try {
for(int i = 0 ; i < 10 ; i++ ){
Object b = o.getClass().newInstance();
list.add(b);
}
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
public static void main(String[] args){
A a = new A();
a.list = a.getList(a);
for(Object o:a.list){
System.out.println(((A)o).a);
}
}
}