理解泛型和反思

时间:2016-02-08 21:06:21

标签: java generics reflection

我需要一些关于java中泛型和反射的帮助。

我尝试实现的是基于类MyClass的工厂类返回另一个实现接口MyClassStore的类Store<MyClass>

如何确保使用反射返回正确类型的商店。

参见示例代码:

public class Application {

    public static void main(String[] args) {

        Store<MyClass> store = Factory.getFactory(MyClass.class);
        MyClass myClass = store.get();
        System.out.println(myClass.getId());

    }

}

public class Factory {

    public static <T> Store<T> getFactory(Class<T> type) {

        Store<T> store = null;
        // TODO: How to implement this
        return store;

    }

}

public class MyClassStore implements Store<MyClass>{

    public MyClass get() {
        return new MyClass("1000");
    }

}

public interface Store<T> {

    public T get();

}

public class MyClass {

    private String id;

    public MyClass(String id) {
        this.id = id;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

}

我尝试了不同的方法但却无法按照我想要的方式工作。这是我尝试过的实现。但是有更好的方法吗?

    public static <T> Store<T> getFactory(Class<T> type) {

        Store<T> store = null;

        if (type == MyClass.class) {
            store = (Store<T>) new MyClassStore();
        }

        return store;

    }

1 个答案:

答案 0 :(得分:0)

只是按照规定解决问题,我能提出的最佳解决方案是在static final Map<Class, Class>Factory映射(在此示例中)从MyClass.class到{{ 1}},用它来查找要实例化的类,并在从地图检索到的MyClassStore.class上调用newInstance()

使用您的设计更自由一点,您可以将Class替换为带有MyClassStore参数的更通用的泛型类,将其存储在本地,并通过调用实现Class<T>存储的get()上的newInstance()。然后,Class可以简单地创建一个通用存储,并传递getFactory()对象。

然而,这种类型的代码让我觉得不太可能成为解决你真正问题的好方法。为什么Class需要创建新的MyClassStore个对象?为什么MyClass的任何实现的内部逻辑需要关心Store实际上是什么类型?在我看来,后一个问题通常是设计不良的强烈指标。