package bluej.debugger.gentype;

import java.util.ArrayList;
import java.util.Map;


| A wildcard type with an upper and/or lower bound. | | <p>Note that both an upper and lower bound is allowed. This type doesn't occur | naturally- it can't be specified in the Java language. But in some cases we | can deduce the type of some object to be this. | | @author Davin McCall | public class GenTypeWildcard extends GenTypeParameter{ GenTypeSolid upperBound; GenTypeSolid lowerBound; | Constructor for a wildcard with a specific upper and lower bound, either of | which may be null. | public GenTypeWildcard(GenTypeSolid upper, GenTypeSolid lower) { upperBound = upper; lowerBound = lower; } @Override public String toString() { return toString(false); } @Override public String toString(NameTransform nt) { if (lowerBound != null) { return "? super " + lowerBound.toString(nt); } else if (upperBound != null) { String uboundStr = upperBound.toString(); if (! uboundStr.equals("java.lang.Object")) return "? extends " + upperBound.toString(nt); } return "?"; } @Override public String toTypeArgString(NameTransform nt) { return toString(nt); } @Override public GenTypeWildcard mapTparsToTypes(Map<String, ? extends GenTypeParameter> tparams) { GenTypeSolid newUpper = null; GenTypeSolid newLower = null; if (upperBound != null) { ArrayList<GenTypeSolid> newUppers = new ArrayList<GenTypeSolid>(); GenTypeSolid [] upperBounds = upperBound.getUpperBounds(); for (int i = 0; i < upperBounds.length; i++) { GenTypeParameter newBound = upperBounds[i].mapTparsToTypes(tparams); if (newBound instanceof GenTypeWildcard) { GenTypeWildcard newWcBound = (GenTypeWildcard) newBound; newUppers.add(newWcBound.upperBound); } else { newUppers.add((GenTypeSolid) newBound); } } GenTypeSolid [] newUppersA = (GenTypeSolid []) newUppers.toArray(new GenTypeSolid[newUppers.size()]); newUpper = IntersectionType.getIntersection(newUppersA); } if (lowerBound != null) { GenTypeParameter newLowerP = lowerBound.mapTparsToTypes(tparams); newLower = newLowerP.getLowerBound(); } return new GenTypeWildcard(newUpper, newLower); } @Override public boolean equals(GenTypeParameter other) { if (this == other) return true; if (! other.isWildcard()) { return false; } GenTypeSolid otherLower = other.getLowerBound(); JavaType otherUpper = other.getUpperBound(); if (upperBound != null && ! upperBound.equals(otherUpper)) { return false; } if (upperBound == null && otherUpper != null) { return false; } if (lowerBound != null && ! lowerBound.equals(otherLower)) { return false; } if (lowerBound == null && otherLower != null) { return false; } return true; } @Override public JavaType getErasedType() { return upperBound.getErasedType(); } @Override public boolean isWildcard() { return true; } @Override public GenTypeSolid getUpperBound() { return upperBound; } @Override public GenTypeSolid getLowerBound() { return lowerBound; } @Override public JavaType getTparCapture() { return new GenTypeCapture(this); } }
top, use, map, class GenTypeWildcard

.   GenTypeWildcard
.   toString
.   toString
.   toTypeArgString
.   mapTparsToTypes
.   equals
.   getErasedType
.   isWildcard
.   getUpperBound
.   getLowerBound
.   getTparCapture




193 neLoCode + 7 LoComm