Re: Class Generics
Jason Cavett wrote:
Class modelClass = Class.forName(modelResult.getNodeValue());
Class viewClass = Class.forName(viewResult.getNodeValue());
factory.put(modelClass, viewClass);
I get the warning with the first two lines:
Class is a raw type. References to generic type Class<T> should be
parameterized
That is correct, but Sun fails to follow that in at least one case
(Enum.class is a Class<Enum> not a Class<Enum<?>>).
So, I figured maybe there was a way to do something like this:
Class<? extends DataModel> modelClass = (Class<? extends DataModel)
Class.forName(modelResult.getNodeValue());
Class<? extends PropertiesView> viewClass = (Class<? extends
PropertiesView) Class.forName(viewResult.getNodeValue());
factory.put(modelClass, viewClass);
Which results in the two warnings:
Type safety: Unchecked cast from Class<capture#1-of ?> to Class<?
extends DataModel>
and
Type safety: Unchecked cast from Class<capture#1-of ?> to Class<?
extends PropertiesView>
Almost, but not quite. What you want is:
Class<? extends DataModel> modelClass = Class.forName(
modelResult.getNodeValue()).asSubclass(DataModel.class);
As aforementioned, this breaks down when handling something like enums:
Class<?> clazz = <get from elsewhere>;
Class<? extends Enum<?>> enumClass = clazz.asSubclass(Enum.class);
Class<? extends Enum<?>> enumClass2 = clazz.asSubclass(Enum<?>.class);
Neither of the last two clauses works, although hopefully generics will
be reified in Java 7 and the last one will work (or they could get off
their butts and fix the first syntax).
--
Beware of bugs in the above code; I have only proved it correct, not
tried it. -- Donald E. Knuth