Thursday, 15 August 2013

How do I get the `.class` attribute from a generic type parameter?

How do I get the `.class` attribute from a generic type parameter?

The accepted answer to this question describes how to create an instance
of T in the Generic<T> class. This involves passing in a Class<T>
parameter to the Generic constructor and callin the newInstance method
from that.
A new instance of Generic<Bar> is then created, and the parameter
Bar.class is passed in.
What do you do if the generic type parameter for the new Generic class is
not some known class like Bar but is itself a generic type parameter?
Suppose I had some other class Skeet<J> and I wanted to create a new
instance of Generic<J> from inside that class. Then, if I try to pass in
J.class I get the following compiler error:
cannot select from a type variable.
Is there any way around this?
The specific bit of code triggering the error for me is:
public class InputField<W extends Component & WidgetInterface>
extends InputFieldArray<W>
{
public InputField(String labelText)
{
super(new String[] {labelText}, W.class);
}
/* ... */
}
public class InputFieldArray<W extends Component & WidgetInterface>
extends
JPanel
{
/* ... */
public InputFieldArray(String[] labelText, Class<W> clazz)
throws InstantiationException,
IllegalAccessException
{
/* ... */
for (int i = 0 ; i < labelText.length ; i++) {
newLabel = new JLabel(labelText[i]);
newWidget = clazz.newInstance();
/* ... */
}
/* ... */
}
/* ... */
}

No comments:

Post a Comment