Przyjęta odpowiedź na this question opisuje, jak utworzyć instancję klasy T
w klasie Generic<T>
. Obejmuje to przekazanie parametru Class<T>
do konstruktora Generic
i wywołanie metody newInstance
z tego.Jak uzyskać atrybut ".class" z ogólnego parametru typu?
Nowa instancja Generic<Bar>
zostaje utworzone, a parametr Bar.class
jest przekazywana.
Co zrobić, jeśli parametr typ rodzajowy dla nowego Generic
klasie nie jest jakiś znany klasa jak Bar
ale sama jest rodzajowy parametr? Załóżmy, że mam inną klasę Skeet<J>
i chciałem utworzyć nową instancję klasy Generic<J>
z wnętrza tej klasy. Następnie, jeśli staram się przekazać w J.class
otrzymuję następujący błąd kompilatora:
cannot select from a type variable.
jest jakiś sposób obejścia tego?
Specyficzny fragment kodu wywołującego błąd dla mnie jest:
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();
/* ... */
}
/* ... */
}
/* ... */
}
Błąd dzieje, bo nie mogę napisać W.class
. Czy istnieje inny sposób przekazywania tych samych informacji?
Twoje pytanie może bardziej jasne, jeśli umieścić przykład kodu (tj. ten, który uruchamia błąd kompilatora). –
Ale musisz mieć nazwę klasy w 'Skeet' prawy? Musisz przekazać tę klasę do konstruktora "Generic". Jeśli wyświetlasz aktualny kod, możemy Ci pomóc. –
nie można używać klasy 'J.class 'z powodu [typu wymazania] (http://stackoverflow.com/questions/tagged/type-erasure). Ale można uzyskać konkretną zmienną 'Class' na' Skeet 'konstrukcji –
RiaD