2012-10-08 40 views
0

是否可以使用类对象声明泛型的类型?在运行时用类对象定义泛型

举例来说,我愿做这样的事情:

Class returnType = theMethod.getReturnType(); 

AttributeComponent<returnType> attComponent; 

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

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

编辑:解释一点点

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

+0

你不能那样做。由于'returnType'是变量,变量不能用作通用参数。 –

回答

3

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

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

所以,你想实例化一个Generic,它的类型只有在运行时才知道,但是在运行时它不会被使用。

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。在我上面的例子中,你用一个你已经知道的类和,并且返回相同的类型(或者某种类型的AttributeComponent或其他)。

+0

这是如何解决我的问题?我试图在运行时定义AttributeComponent泛型类型,如果甚至可能的话(@Vash已经声明它不是)。我编辑了原始文章,了解我想要实现的更多信息) –

+1

长话短说,你可以不使用类引用作为泛型类型。如果您需要在特定上下文中使用类ref和泛型,则需要将它们都传递给该方法(如我的示例中的*或*),您需要不安全地执行它(保留泛型并将通过反射获取的返回类型转换为'类')。 –