private BoundedReferenceType getWildcard() { if (wildcard == null) { wildcard = new BoundedReferenceType(this); } return wildcard; }
@Override public UnresolvedType parameterize(Map<String, UnresolvedType> typeBindings) { if (this.kind == UNBOUND) { return this; } ReferenceType[] parameterizedAdditionalInterfaces = new ReferenceType[additionalInterfaceBounds == null ? 0 : additionalInterfaceBounds.length]; for (int i = 0; i < parameterizedAdditionalInterfaces.length; i++) { parameterizedAdditionalInterfaces[i] = (ReferenceType) additionalInterfaceBounds[i].parameterize(typeBindings); } if (this.kind == EXTENDS) { return new BoundedReferenceType((ReferenceType) getUpperBound().parameterize(typeBindings), true, world, parameterizedAdditionalInterfaces); } else { // (this.kind == SUPER) return new BoundedReferenceType((ReferenceType) getLowerBound().parameterize(typeBindings), false, world, parameterizedAdditionalInterfaces); } }
bound = fromType(lowerBounds[0]); return new BoundedReferenceType((ReferenceType) bound, isExtends, getWorld()); } else if (type instanceof GenericArrayType) { GenericArrayType genericArrayType = (GenericArrayType) type;
/** * Go from an unresolved generic wildcard (represented by UnresolvedType) to a resolved version (BoundedReferenceType). */ private ReferenceType resolveGenericWildcardFor(WildcardedUnresolvedType aType) { BoundedReferenceType ret = null; // FIXME asc doesnt take account of additional interface bounds (e.g. ? super R & Serializable - can you do that?) if (aType.isExtends()) { ResolvedType resolvedUpperBound = resolve(aType.getUpperBound()); if (resolvedUpperBound.isMissing()) { return getWildcard(); } ret = new BoundedReferenceType((ReferenceType)resolvedUpperBound, true, this); } else if (aType.isSuper()) { ResolvedType resolvedLowerBound = resolve(aType.getLowerBound()); if (resolvedLowerBound.isMissing()) { return getWildcard(); } ret = new BoundedReferenceType((ReferenceType)resolvedLowerBound, false, this); } else { // must be ? on its own! ret = getWildcard(); } return ret; }
} else { ReferenceType upper = (ReferenceType) upperBound.getExactType().resolve(scope.getWorld()); type = new BoundedReferenceType(upper, true, scope.getWorld()); } else { ReferenceType lower = (ReferenceType) lowerBound.getExactType().resolve(scope.getWorld()); type = new BoundedReferenceType(lower, false, scope.getWorld());
return new BoundedReferenceType(rBound, false, world); } else if (aTypeArgument.isPlus) { UnresolvedType bound = fieldTypeSignature2TypeX(aTypeArgument.signature, typeParams, world, return new BoundedReferenceType(rBound, true, world); } else { return fieldTypeSignature2TypeX(aTypeArgument.signature, typeParams, world, inProgressTypeVariableResolutions);