gpt4 book ai didi

Java 泛型和反射

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:35:32 25 4
gpt4 key购买 nike

我正在写一个小类,我遇到了一个问题。

这个类读取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 传递给我的加载方法或将其保存在我的类中的某个私有(private)位置或者b) 保留一些私有(private)对象 T 并在方法中使用它来获取 Class 对象?

我问是因为我想确定是否没有任何其他方法可以做到这一点。

最佳答案

您还可以考虑另一种方式。那就是让您的 CSVMap 将一个对象作为其构造函数的参数,该对象知道如何从一个类转换为另一个类。

例如。

public class Test {

public static void main(String[] args) {
CSVMapLoader<Integer> loader = new CSVMapLoader<Integer>(new IntegerParser());
loader.load();
}

}

class CSVMapLoader<T> {

private final Parser<T> parser;

public Loader(Parser<T> parser) {
this.parser = parser;
}

public CSVMap<T> load() {
// as an example of how to get your T
T t = parser.parse("1000");
System.out.println("t equal to 1000? "+(t.equals(1000)));
// and instead put your real logic to load up map here
}
}

interface Parser<T> {
public T parse(String str);
}

class IntegerParser implements Parser<Integer> {

public Integer parse(String str) {
return Integer.valueOf(str);
}
}

作为代码设计的旁注。在这种情况下,您不应该真正继承 (Abstract)Map 。你想要的是知道如何从 csv 文件加载键值对的类。 Map 接口(interface)只是在加载后存储和访问这些对。所以你真的想要一个单独的工厂类,它接受一个文件、解析器和可能的基本 map 类型并为你加载 map 。留给您一个未受影响的 map 实例,您不知道它是如何加载的。

关于Java 泛型和反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8371532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com