【发布时间】:2011-12-03 22:26:01
【问题描述】:
我在写一个小课,遇到了一个问题。
这个类读取 CSV 文件,每个键只有一个值。我有
class CSVMap<T> extends AbstractMap<String,T>
我有:
public void load(String filename)
{
try
{
BufferedReader out=new BufferedReader(new FileReader(filename));
String []tab;
T value;
while(out.ready());
{
tab=out.readLine().split(",");
}
} catch (IOException e)
{
e.printStackTrace();
}
}
现在我需要创建 T 的新实例以将它们放入我的地图中(我知道 T 具有接受字符串的构造函数)。
我知道 Java 中的类型擦除,所以唯一的出路是 a) 将 T.Class 传递给我的 load 方法或将其保存在我的类中的某个私有位置 或者 b) 保留一些私有对象 T 并在方法中使用它来获取 Class 对象?
我问是因为我想确定是否没有其他方法可以做到这一点。
【问题讨论】:
-
不,这正是你应该做的——如果你环顾四周,JDK 也会做同样的事情。
-
这就是反射是一种获取代码信息的弱方法的原因:你只能得到编译器愿意留下的东西。并且随着类型擦除,它不清楚要留下什么(原始类型?所有中间类型?)并且类文件几乎没有任何方式谈论泛型。所以,java 编译器的人决定把它排除在外。唯一真正好的“反射”方案,可以让你获得源代码的任何信息,本质上是一个编译器前端。
标签: java generics reflection csv