/** * Establishes the type bound: * * <ol> * <li>{@code<? extends Number>}, returns Number * <li>{@code<? super Number>}, returns Number * <li>{@code<?>}, returns Object * <li>{@code<T extends Number>, returns Number} * </ol> * * @param typeMirror the type to return the bound for * @return the bound for this parameter */ public TypeMirror getTypeBound(TypeMirror typeMirror) { if (typeMirror.getKind() == TypeKind.WILDCARD) { WildcardType wildCardType = (WildcardType) typeMirror; if (wildCardType.getExtendsBound() != null) { return wildCardType.getExtendsBound(); } if (wildCardType.getSuperBound() != null) { return wildCardType.getSuperBound(); } String wildCardName = wildCardType.toString(); if ("?".equals(wildCardName)) { return elementUtils.getTypeElement(Object.class.getCanonicalName()).asType(); } } else if (typeMirror.getKind() == TypeKind.TYPEVAR) { TypeVariable typeVariableType = (TypeVariable) typeMirror; if (typeVariableType.getUpperBound() != null) { return typeVariableType.getUpperBound(); } // Lowerbounds intentionally left out: Type variables otherwise have a lower bound of // NullType. } return typeMirror; }
@Override public JsonType visitWildcard(WildcardType wildcardType, Void o) { throw new UnsupportedOperationException(wildcardType.toString()); }