Java 泛型和反射

标签 java generics reflection csv

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

这个类读取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/

相关文章:

java - Apache Fluent Client 对 HttpClient 的传递依赖导致 NoClassDefFoundExceptions

java - 泛型 - 迭代 ArrayList 时出现 ClassCastException

java - 类类型的可变参数 - Java

java - 如何使用 guice 使用通用 jsonFile 处理程序?

Java,通过反射记录方法名称

c# - Fastmember 访问非公共(public)属性

java-ee-7 - 为什么 Java EE API 本身是由应用服务器制造商实现的?

java - Jackson JsonParser 将 DateTime 月份偏移 -1

java - 测试 Junit 和 Mockito 在分析日期和小时数时出现错误

java - 如何使用 Reflection API 查找类