|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object de.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.
Field Summary | |
---|---|
static String |
FACTORY_METHOD_NAME
Name for a static "parameterize" factory method. |
private static Logging |
logger
Static logger to use. |
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
|
getParameterizationFactoryMethod(Class<C> c,
Class<?> ret)
Inspect the class for a static "parameterize" method that satisfies certain constraints. |
|
static Parameterizer |
getParameterizer(Class<?> c)
Get a parameterizer for the given class. |
|
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
|
parameterizeOrAbort(Class<?> c,
Parameterization config)
Force parameterization method. |
|
static
|
toArray(Collection<T> coll,
Class<B> base)
Convert a collection to an array. |
|
static
|
tryInstantiate(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 |
Field Detail |
---|
private static final Logging logger
public static final String FACTORY_METHOD_NAME
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> Method getParameterizationFactoryMethod(Class<C> c, Class<?> ret) throws NoSuchMethodException, Exception
C
- Return class typec
- Class to inspect.ret
- Expected return type
factory(null, Parameterization)
.
NoSuchMethodException
- When no factory method was found, or it
doesn't fit the constraints.
Exception
- On other errors such as security exceptionspublic static Parameterizer getParameterizer(Class<?> c)
c
- Class
public static <C> C tryInstantiate(Class<C> r, Class<?> c, Parameterization config) throws InvocationTargetException, NoSuchMethodException, Exception
Parameterization.descend(java.lang.Object)
!
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 <C> C parameterizeOrAbort(Class<?> c, Parameterization config)
C
- Typec
- Class to instantiateconfig
- Parameters
public 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 |