|
|
|||||||||||||||||||||
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
|
cloneCollection(C coll)
Clone a collection. |
|
static
|
collectionToArray(Collection<T> c,
T[] a)
Transform a collection to an Array |
|
static
|
getComponentType(T[] a)
Retrieve the component type of a given array. |
|
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
|
newArray(Class<? extends T> k,
int size)
Make a new array of the given class and size. |
|
static
|
newArray(T[] a,
int size)
Clone an array of the given type. |
|
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
|
newInstance(T obj)
Generic newInstance that tries to clone an object. |
|
static
|
toArray(Collection<T> coll,
Class<B> base)
Convert a collection to an array. |
|
static
|
tryInstanciate(Class<C> r,
Class<?> c,
Parameterization config)
Instantiate a parameterizable class. |
|
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 <C> C tryInstanciate(Class<C> r, Class<?> c, Parameterization config) throws InvocationTargetException, NoSuchMethodException, Exception
Parameterization.descend(de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.Parameter, ?>)
!
C
- base typer
- Base (restriction) classc
- Class to instantiateconfig
- Configuration to use for instantiation.
InvocationTargetException
- when an exception occurred within the
constructor
NoSuchMethodException
- when no suitable constructor was found
Exception
- when other instantiation errors occurredpublic 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)
B
- Base typeT
- 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.
D
- Base typeT
- Supertypecls
- Class type
cls
parameter, but cast to Class<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
public static <T> T newInstance(T obj) throws InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException
T
- Object type, genericobj
- Master copy - must not be null.
InstantiationException
- on error
IllegalAccessException
- on error
InvocationTargetException
- on error
NoSuchMethodException
- on errorpublic static <T> Class<? extends T> getComponentType(T[] a)
T
- Array type, generica
- Existing array
public static <T> T[] newArray(Class<? extends T> k, int size)
T
- Generic typek
- Classsize
- Size
public static <T> T[] newArray(T[] a, int size)
T
- Generic typea
- existing arraysize
- array size
public static <T,C extends Collection<T>> C cloneCollection(C coll)
T
- Data typeC
- Collection typecoll
- Existing collection
public static <T> T[] collectionToArray(Collection<T> c, T[] a)
T
- object typec
- Collectiona
- Array to write to or replace (i.e. sample array)
|
|
|||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |