package org.etk.reflect.api.metadata; import org.etk.reflect.api.definition.ClassKind; import org.etk.reflect.api.definition.LiteralKind; import org.etk.reflect.api.definition.TypeKind; /** * Define the TypeMetadata represents to generic model. * * @author thanh_vucong * @param <T> */ public interface TypeMetadata<T> { /** * Gets the TypeKind via a given SimpleType * @param type * @return */ TypeKind getKind(T type); LiteralKind getLiteralType(T simpleType); boolean isPrimitive(T simpleType); String getClassName(T classType); T getEnclosing(T classType); Iterable<T> getInterfaces(T classType); T getSuperClass(T classType); /** * Gets the ClassKind by a given ClassType * @param classType * @return */ ClassKind getClassKind(T classType); Iterable<T> getTypeParameters(T classType); String getName(T typeVariable); T getComponentType(T arrayType); T getGenericDeclaration(T typeVariable); GenericDeclarationKind getGenericDeclarationKind(T typeVariable); T getRawType(T parameterizedType); Iterable<T> getTypeArguments(T parameterizedType); Iterable<T> getBounds(T typeVariable); Iterable<T> getUpperBounds(T wildcardType); Iterable<T> getLowerBounds(T wildcardType); }