|
|
|||||||||||||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||||||||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectde.lmu.ifi.dbs.elki.utilities.ClassGenericsUtil
public final class ClassGenericsUtil
Utils for handling class instantiation especially with respect to Java generics.
Due to the way generics are implemented - via erasure - type safety cannot be guaranteed properly at compile time here. These classes collect such cases using helper functions, so that we have to suppress these warnings only in one place.
Note that many of these situations are still type safe, i.e. an empty
array of List> can indeed be cast into a List
>.
The only one potentially unsafe is instantiateGenerics(java.lang.Class>, java.lang.String)
, since we
can't verify that the runtime type 'type' adhers to the compile time
restriction T. When T is not generic, such a check is possible, and then the
developer should use instantiate(java.lang.Class
instead.
Constructor Summary | |
---|---|
ClassGenericsUtil()
|
Method Summary | ||
---|---|---|
static
|
castWithGenericsOrNull(Class<B> base,
Object obj)
Cast an object at a base class, but return a subclass (for Generics!). |
|
static
|
instantiate(Class<T> type,
String className)
Returns a new instance of the given type for the specified className. |
|
static
|
instantiateGenerics(Class<?> type,
String className)
Returns a new instance of the given type for the specified className. |
|
static
|
newArrayOfEmptyArrayList(int len)
Create an array of len empty ArrayLists. |
|
static
|
newArrayOfEmptyHashSet(int len)
Create an array of len empty HashSets. |
|
static
|
newArrayOfNull(int len,
Class<T> base)
Create an array (of null values) This is a common unchecked cast we have to do due to Java Generics limitations. |
|
static
|
toArray(Collection<T> coll,
Class<B> base)
Convert a collection to an array. |
|
static
|
uglyCastIntoSubclass(Class<D> cls)
Cast the (erased) generics onto a class. |
|
static
|
uglyCrossCast(Class<FROM> cls,
Class<BASE> base)
This class performs an ugly cast, from Class<F> to
Class<T> , where both F and T need to extend B. |
Methods inherited from class java.lang.Object |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Constructor Detail |
---|
public ClassGenericsUtil()
Method Detail |
---|
public static <T> T instantiate(Class<T> type, String className) throws UnableToComplyException
Returns a new instance of the given type for the specified className.
If the Class for className is not found, the instantiation is tried using the package of the given type as package of the given className.
T
- Class type for compile time type checkingtype
- desired Class type of the Object to retrieveclassName
- name of the class to instantiate
UnableToComplyException
- if the instantiation cannot be performed
successfullypublic static <T> T instantiateGenerics(Class<?> type, String className) throws UnableToComplyException
Returns a new instance of the given type for the specified className.
If the Class for className is not found, the instantiation is tried using the package of the given type as package of the given className.
This is a weaker type checked version of "instantiate(java.lang.Class
" for use
with Generics.
T
- Class type for compile time type checkingtype
- desired Class type of the Object to retrieveclassName
- name of the class to instantiate
UnableToComplyException
- if the instantiation cannot be performed
successfullypublic static <T> T[] newArrayOfNull(int len, Class<T> base)
T
- Type the array elements havelen
- array sizebase
- template class for array creation.
public static <B,T extends B> T[] toArray(Collection<T> coll, Class<B> base)
T
- Type the array elements havecoll
- collection to convert.base
- Template class for array creation.
public static <T> ArrayList<T>[] newArrayOfEmptyArrayList(int len)
len
empty ArrayLists.
This is a common unchecked cast we have to do due to Java Generics
limitations.
T
- Type the list elements havelen
- array size
public static <T> HashSet<T>[] newArrayOfEmptyHashSet(int len)
len
empty HashSets.
This is a common unchecked cast we have to do due to Java Generics
limitations.
T
- Type the set elements havelen
- array size
public static <D,T extends D> Class<T> uglyCastIntoSubclass(Class<D> cls)
Class<Set<String>> setclass = uglyCastIntoSubclass(Set.class);
We can't type check at runtime, since we don't have T.
public static <BASE,FROM extends BASE,TO extends BASE> Class<TO> uglyCrossCast(Class<FROM> cls, Class<BASE> base)
Class<F>
to
Class<T>
, where both F and T need to extend B.
The restrictions are there to avoid misuse of this cast helper.
While this sounds really ugly, the common use case will be something like
BASE = Class<Database> FROM = Class<Database> TO = Class<Database<V>>i.e. the main goal is to add missing Generics to the compile time type.
BASE
- Base typeTO
- Destination typeFROM
- Source typecls
- Class to be castbase
- Base class for type checking.
public static <B,T extends B> T castWithGenericsOrNull(Class<B> base, Object obj)
List
" to "List<Something>
" without having
to add SuppressWarnings everywhere.
B
- Base type to cast atT
- Derived type returnedbase
- Base class to cast atobj
- Object
|
|
|||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |