protected LightweightTypeReference getMostSpecialTypeIfAllWildcards(List<LightweightTypeReference> types) { boolean objectIsCandidate = false; boolean lowerBoundSeen = false; for(LightweightTypeReference type: types) { if (type instanceof WildcardTypeReference) { if (((WildcardTypeReference) type).getLowerBound() == null) { objectIsCandidate = true; } else { lowerBoundSeen = true; } } else { return null; } } if (!lowerBoundSeen) { return null; } if (objectIsCandidate) return owner.newWildcardExtendsObject(); return getMostSpecialType(types); }
if (mostSpecialTypeIfAllWildcards instanceof WildcardTypeReference) return mostSpecialTypeIfAllWildcards; WildcardTypeReference result = owner.newWildcardExtendsObject(); result.setLowerBound(mostSpecialTypeIfAllWildcards); return result; return owner.newWildcardExtendsObject(); return superType; if (superType == null) { return owner.newWildcardExtendsObject();
parameterReferences.add(wildcard); } else if (functionType.getParameterTypes().contains(parameterReference)) { WildcardTypeReference wildcard = owner.newWildcardExtendsObject(); wildcard.setLowerBound(parameterReference); parameterReferences.add(wildcard);
@Override protected LightweightTypeReference visitTypeArgument(LightweightTypeReference reference, ConstraintVisitingInfo visiting, boolean lowerBound) { if (lowerBound && (reference instanceof ParameterizedTypeReference)) { if (reference.getType() instanceof JvmTypeParameter) { JvmTypeParameter typeParameter = (JvmTypeParameter) reference.getType(); // don't recurse into lower bounds of wildcards, e.g. constraint bound of // C extends Comparable<? super C> // is not // Comparable<? super Object> // but // Comparable<?> if (!visiting.canVisit(typeParameter)) { return getOwner().newWildcardExtendsObject(); } } } return super.visitTypeArgument(reference, visiting, lowerBound); }