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