在运行时使用类对象定义泛型类型

时间:2012-10-08 08:48:19

标签: java generics reflection

是否可以使用类对象声明泛型的类型?

例如,我想做这样的事情:

Class returnType = theMethod.getReturnType();

AttributeComponent<returnType> attComponent;

attComponent = new AttributeComponent<returnType>(returnType, attName);
attributeComponents.put(methodName.substring(3), attComponent);

现在我知道这显然是不正确的,但有没有办法实现这个目标?

编辑:解释一下

我正在使用反射遍历所有getter,然后为每个属性生成一个UI元素(AttributeComponent类,它有一个JComponent元素和一个JLabel)。我想使用泛型来创建一个getValue()方法,该方法将返回属性类型的对象。

2 个答案:

答案 0 :(得分:3)

我不知道是否有办法编译类似的东西,但它没什么价值。

认为由于类型擦除,编译后的类不使用泛型信息。也就是说,执行Set<String> a = new Set<String>();对于在编译时检查a的使用非常有用,但在运行时则不行。

因此,您希望实例化一个Generic,其类型仅在运行时已知,但在运行时它将不会被使用。

答案 1 :(得分:2)

我想说这可以通过将方法返回类型定义为泛型来实现;但是你需要将实际类型作为类参数传递给你,就像你已经显示的那样:

<T> T yourMethod(Class<T> returnType) {
    // use <T> as generic and returnType to refer to the actual T class
    /* ... */ new AttributeComponent<T>(returnType, attName);
}

查看您正在尝试执行的操作的更大背景也很有用。如果你希望AttributeComponent.getValue()返回一些泛型类型T(这是方法返回类型),除非你在编译时知道每个方法的返回类型,否则它是完全无用的,否则T将是无效的超过Object。在上面的示例中,您使用您已经知道的类调用yourMethod,并返回相同的类型(或该类型的某些AttributeComponent或其他)。