如何将动态创建的类用作泛型?

时间:2015-11-17 18:33:29

标签: java generics dynamic

我的问题是我确实有一个在运行时创建,编译和初始化的类。我这样做是将文件写为TestClass,即File f, 然后编译:

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
          compiler.run(null,null,null,f.getPath());

之后我根据这个例子加载我的课程并使用我的方法等; http://viralpatel.net/blogs/java-dynamic-class-loading-java-reflection-api/

现在我的问题是我需要这样做:

MyTask<T> m = new MyTask<T>(0,0,0);

T应该是我动态创建的类而不是Integer.class等。但是我还没有找到适合它的方法。如果您在上面给出的链接中检查了示例,您将看到我可以在Object形式中拥有我的类的实例,并且我可以为我的动态类创建一个Class实例。但是,无论我尝试什么,我都无法找到解决方案。

它一直说Class myClass,不能用作类型。那么我该如何将这个动态创建的类用作类型。非常感谢你。

2 个答案:

答案 0 :(得分:2)

没有有用的方法在源代码中表达编译时不存在的类型。除了使用Object作为类型参数之外,它无论如何都不会获得更多,因为Java泛型提供编译时类型检查,而不是运行时类型检查。

可能是通过创建动态类将实现的接口并使用接口类型作为类型参数来实现您的目的。

答案 1 :(得分:0)

由于通用类型信息仅在编译时可用,因此无法实现。在运行时创建类时,任何地方都没有可用的通用信息。

如果您的类实现了一个接口,那么您应该将其用作代码中的类型。

的内容
MyInterface foo = myDynamicClass.newInstance();
someGenericMethod(foo);

public <T extends MyInterface> void someGenericMethod(T param) {}
// Or more likely, if there's no other classes that extend MyInterface
public void someGenericMethod(MyInterface param) {}

当然,使用泛型类型信息可能没有任何意义,因为它用于静态类型检查,并且您正在使用动态上课。