mjc

org.multijava.mjc
Class CWildcardType

java.lang.Object
  extended byorg.multijava.util.Utils
      extended byorg.multijava.mjc.CType
          extended byorg.multijava.mjc.CClassType
              extended byorg.multijava.mjc.CWildcardType
All Implemented Interfaces:
Cloneable, Comparable, Constants, Constants, CTypeSignatureAppender

public class CWildcardType
extends CClassType

Type representing a wildcard (JLS3 4.5.1). The semantics of a wildcard in the generic Java type system are fully determined by its optional upper/lower bound and by the formal type variable (JLS3 4.4) for which the wildcard is a type argument (JLS3 4.5.1).


Nested Class Summary
 
Nested classes inherited from class org.multijava.mjc.CType
CType.MethodSignature, CType.MethodSignatureParser, CType.StringBuffers, CType.TupleCollection
 
Field Summary
private  CClassType bound
          The (upper or lower) bound of the wildcard.
private  boolean isUpperBounded
          Indicates whether the wildcard has been explicitely or implicitely upper bounded.
private  CTypeVariable typeVariable
          The formal type variable for which this wildcard is a type argument.
 
Fields inherited from class org.multijava.mjc.CClassType
arguments, EMPTY, EMPTY_ARG, index, universe
 
Fields inherited from class org.multijava.mjc.CType
instance, isMethodTypeVariable, isTypeVariable, type
 
Fields inherited from class org.multijava.util.Utils
DBG_LEVEL_HIGH, DBG_LEVEL_LOW, DBG_LEVEL_NO
 
Fields inherited from interface org.multijava.mjc.Constants
ACC_MODIFIER_FLAGS_MASK, ACC_NON_NULL, ACC_NON_NULL_BY_DEFAULT, ACC_NULLABLE, ACC_NULLABLE_BY_DEFAULT, ACC_PURE, ACCESS_FLAG_ARRAY, ACCESS_FLAG_NAMES, AMID_JAVA_MATH, AMID_MAX, AMID_SAFE_MATH, CMP_VERSION, IMPLICITLY_NON_NULL, JAV_ASSERTION_ERROR, JAV_CLASS, JAV_CLASSLOADER, JAV_CLASSNOTFOUND_EXCEPTION, JAV_CLONE, JAV_CLONEABLE, JAV_CONSTRUCTOR, JAV_ERROR, JAV_EXCEPTION, JAV_INIT, JAV_LENGTH, JAV_NAME_SEPARATOR, JAV_NOCLASSDEFFOUND_ERROR, JAV_OBJECT, JAV_OUTER_THIS, JAV_RMJ_RUNTIME_EXCEPTION, JAV_RUNTIME, JAV_RUNTIME_EXCEPTION, JAV_SERIALIZABLE, JAV_STATIC_INIT, JAV_STRING, JAV_STRINGBUFFER, JAV_SUPER, JAV_THIS, JAV_THROWABLE, MJ_ANCHOR, NULLITY_MODS, OPE_BAND, OPE_BNOT, OPE_BOR, OPE_BSR, OPE_BXOR, OPE_EQ, OPE_GE, OPE_GT, OPE_LAND, OPE_LE, OPE_LNOT, OPE_LOR, OPE_LT, OPE_MINUS, OPE_NE, OPE_PERCENT, OPE_PLUS, OPE_POSTDEC, OPE_POSTINC, OPE_PREDEC, OPE_PREINC, OPE_SIMPLE, OPE_SL, OPE_SLASH, OPE_SR, OPE_STAR, TID_ARRAY, TID_BOOLEAN, TID_BYTE, TID_CHAR, TID_CLASS, TID_DOUBLE, TID_FLOAT, TID_INT, TID_LONG, TID_MAX, TID_SHORT, TID_VOID, UNIV_ARRAY_TMP, UNIV_TMP
 
Fields inherited from interface org.multijava.util.classfile.Constants
ACC_ABSTRACT, ACC_FINAL, ACC_INTERFACE, ACC_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_VOLATILE, ATT_ANCHOR, ATT_BRIDGE, ATT_CODE, ATT_CONSTANTVALUE, ATT_DEPRECATED, ATT_DISPATCHER, ATT_EXCEPTIONS, ATT_GENERIC, ATT_GENERIC_FUNCTIONS, ATT_INNERCLASSES, ATT_LINENUMBERTABLE, ATT_LOCALVARIABLETABLE, ATT_MM_BODY, ATT_REDIRECTOR, ATT_RMJ_GLUE, ATT_RMJ_SIGNATURE, ATT_RUNTIME_VISIBLE_ANNOTATIONS, ATT_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS, ATT_SIGNATURE, ATT_SOURCEFILE, ATT_SYNTHETIC, ATT_UNIVERSE_FIELD, ATT_UNIVERSE_METHOD, ATT_UNIVERSE_VERSION, CST_CLASS, CST_DOUBLE, CST_FIELD, CST_FLOAT, CST_INTEGER, CST_INTERFACEMETHOD, CST_LONG, CST_METHOD, CST_NAMEANDTYPE, CST_STRING, CST_UTF8, ENV_DEBUG_MODE, ENV_USE_CACHE, JAVA_MAGIC, JAVA_MAJOR, JAVA_MINOR, MAX_CODE_PER_METHOD, opc_aaload, opc_aastore, opc_aconst_null, opc_aload, opc_aload_0, opc_aload_1, opc_aload_2, opc_aload_3, opc_anewarray, opc_areturn, opc_arraylength, opc_astore, opc_astore_0, opc_astore_1, opc_astore_2, opc_astore_3, opc_athrow, opc_baload, opc_bastore, opc_bipush, opc_caload, opc_castore, opc_checkcast, opc_d2f, opc_d2i, opc_d2l, opc_dadd, opc_daload, opc_dastore, opc_dcmpg, opc_dcmpl, opc_dconst_0, opc_dconst_1, opc_ddiv, opc_dload, opc_dload_0, opc_dload_1, opc_dload_2, opc_dload_3, opc_dmul, opc_dneg, opc_drem, opc_dreturn, opc_dstore, opc_dstore_0, opc_dstore_1, opc_dstore_2, opc_dstore_3, opc_dsub, opc_dup, opc_dup2, opc_dup2_x1, opc_dup2_x2, opc_dup_x1, opc_dup_x2, opc_f2d, opc_f2i, opc_f2l, opc_fadd, opc_faload, opc_fastore, opc_fcmpg, opc_fcmpl, opc_fconst_0, opc_fconst_1, opc_fconst_2, opc_fdiv, opc_fload, opc_fload_0, opc_fload_1, opc_fload_2, opc_fload_3, opc_fmul, opc_fneg, opc_frem, opc_freturn, opc_fstore, opc_fstore_0, opc_fstore_1, opc_fstore_2, opc_fstore_3, opc_fsub, opc_getfield, opc_getstatic, opc_goto, opc_goto_w, opc_i2b, opc_i2c, opc_i2d, opc_i2f, opc_i2l, opc_i2s, opc_iadd, opc_iaload, opc_iand, opc_iastore, opc_iconst_0, opc_iconst_1, opc_iconst_2, opc_iconst_3, opc_iconst_4, opc_iconst_5, opc_iconst_m1, opc_idiv, opc_if_acmpeq, opc_if_acmpne, opc_if_icmpeq, opc_if_icmpge, opc_if_icmpgt, opc_if_icmple, opc_if_icmplt, opc_if_icmpne, opc_ifeq, opc_ifge, opc_ifgt, opc_ifle, opc_iflt, opc_ifne, opc_ifnonnull, opc_ifnull, opc_iinc, opc_iload, opc_iload_0, opc_iload_1, opc_iload_2, opc_iload_3, opc_imul, opc_ineg, opc_instanceof, opc_invokeinterface, opc_invokespecial, opc_invokestatic, opc_invokevirtual, opc_ior, opc_irem, opc_ireturn, opc_ishl, opc_ishr, opc_istore, opc_istore_0, opc_istore_1, opc_istore_2, opc_istore_3, opc_isub, opc_iushr, opc_ixor, opc_jsr, opc_jsr_w, opc_l2d, opc_l2f, opc_l2i, opc_ladd, opc_laload, opc_land, opc_lastore, opc_lcmp, opc_lconst_0, opc_lconst_1, opc_ldc, opc_ldc2_w, opc_ldc_w, opc_ldiv, opc_lload, opc_lload_0, opc_lload_1, opc_lload_2, opc_lload_3, opc_lmul, opc_lneg, opc_lookupswitch, opc_lor, opc_lrem, opc_lreturn, opc_lshl, opc_lshr, opc_lstore, opc_lstore_0, opc_lstore_1, opc_lstore_2, opc_lstore_3, opc_lsub, opc_lushr, opc_lxor, opc_monitorenter, opc_monitorexit, opc_multianewarray, opc_new, opc_newarray, opc_nop, opc_pop, opc_pop2, opc_putfield, opc_putstatic, opc_ret, opc_return, opc_saload, opc_sastore, opc_sipush, opc_swap, opc_tableswitch, opc_wide, opc_xxxunusedxxx, POO_ASCII_CONSTANT, POO_CLASS_CONSTANT, POO_DOUBLE_CONSTANT, POO_FLOAT_CONSTANT, POO_INTEGER_CONSTANT, POO_LONG_CONSTANT, POO_NAT_CONSTANT, POO_REF_CONSTANT, POO_STRING_CONSTANT, TYP_ADDRESS, TYP_DOUBLE, TYP_FLOAT, TYP_INT, TYP_LONG, TYP_REFERENCE, TYP_VOID
 
Constructor Summary
private CWildcardType(boolean isUpperBounded, CClassType bound)
          Constructor for creating an eventually bounded wildcard.
 
Method Summary
 void appendGenericSignature(FastStringBuffer buffer)
           
 void appendSignature(FastStringBuffer buff)
          Note that a non-generic signature should never be used for a wildcard since a wildcard is always a generic type argument.
 CClassType capture()
          The capture type depends on the optional bound of the wildcard as well as on the formal type variable for which this wildcard is a type argument.
 CType checkType(CContextType context)
          During type checking, the wildcard's optional bound is type checked, too.
 boolean contains(CClassType type)
          Returns whether this type contains the given type as defined in JLS3 4.5.1.1.
static CWildcardType createLowerBoundedWildcard(CClassType lowerBound)
          Creates a lower bounded wildcard with the given lowerBound.
static CWildcardType createUpperBoundedWildcard(CClassType upperBound)
          Creates an upper bounded wildcard with the given upperBound.
static CWildcardType createWildcard()
          Creates a wildcard implicitely upper bounded by the java.lang.Object class.
 boolean equals(Object other)
          Compares two objects for equality.
 boolean equals(Object other, boolean enableUniv)
          Compares two objects for equality.
 boolean equals(CType other, CClassType[] substitution)
           
 boolean equals(CType other, CClassType[] substitution, boolean enableUniv)
           
 CClassType getBound()
          Returns the (upper or lower) bound of this wildcard which is null if and only if the wildcard was declared without an explicit bound.
 CType getErasure()
          Returns the erasure of this wildcard's capture type.
 CClassType getExplicitOrImplicitBound()
          Convenience method returning either the bound explicitely provided in the wildcard declaration, if any, or, otherwise, the implicit bound java.lang.Object.
 CTypeVariable getTypeVariable()
          Returns the formal type variable for which this wildcard is a type argument.
 boolean isAlwaysAssignableTo(CType dest)
          This wildcard is assignable to the given type if and only if its capture type is assignable to it.
 boolean isAlwaysAssignableTo(CType dest, boolean inst)
          This wildcard is assignable to the given type if and only if its capture type is assignable to it.
 boolean isAlwaysAssignableTo(CType dest, CClassType[] substitution)
          This wildcard is assignable to the given type if and only if its capture type is assignable to it.
 boolean isAlwaysAssignableToNoUniverses(CType dest, CClassType[] substitution)
          This wildcard is assignable to the given type if and only if its capture type is assignable to it.
 boolean isBounded()
          Returns whether an explicit bound has been specified in the declaration of this wildcard.
 boolean isUpperBounded()
          Returns whether this wildcard type has an explicit or implicit upper bound.
 boolean isValidTypeArgumentFor(CTypeVariable typeVariable, CClassType[] substitution)
          Returns whether this type is a valid type argument for the given typeVariable.
 boolean isWildcard()
          Returns whether this is a wildcard type.
 void setTypeVariable(CTypeVariable typeVariable)
          Sets the formal type variable for which this wildcard is a type argument.
 String toString()
          Transforms this type to a string also assignable loadedClassInfo, thisClassInfo; ensures \not_modified(loadedClassInfo);
 
Methods inherited from class org.multijava.mjc.CClassType
clone, createSubstitutedType, directlyVisibleTypes, getAllArguments, getArguments, getCClass, getCUniverse, getCUniverseJMLString, getCUniverseMJString, getCUniverseString, getIndex, getSize, getUniverseByteConstant, getVisibleTypesFrom, hashCode, hasUnboundedWildcardTypeArgumentsOnly, hasWildcardTypeArgument, ident, implicitlyCastTo, isAssignableTo, isCastableTo, isChecked, isCheckedException, isClassType, isConcrete, isInterface, isLocalTo, isNestedType, isParameterizedType, isRawTypeInvocationOf, isReference, needsUncheckedConversion, needsUncheckedConversion, originalQualifiedName, plantDispatchTest, printArgs, qualifiedName, resolveValueType, setAllArguments, setClass, setCUniverse, setIndex, toVerboseString
 
Methods inherited from class org.multijava.mjc.CType
changesByErasure, checked, compareTo, genGenericMethodSignature, genGenericMethodSignature, genGenericMethodSignatureHelper, genMethodSignature, genMultimethodSignature, getCapture, getErasure, getGenericSignature, getIdent, getLoadOpcode, getReturnOpcode, getSignature, getStoreOpcode, getTypeID, getValue, isArrayType, isBoolean, isCapture, isClassTypeVariable, isCodedAsInt, isFloatingPoint, isGenericType, isMethodTypeVariable, isNumeric, isOrdinal, isPrimitive, isRawType, isReifiableType, isTypeVariable, isValueType, isVoid, parseGenericTypeSignature, parseGenericTypeSignature, parseMethodSignature, parseMethodSignature, parseSignature, parseSignature, setMethodTypeVariable, setTypeVariable, specializerSymbol, tupleToString, tupleToString
 
Methods inherited from class org.multijava.util.Utils
assertTrue, assertTrue, combineArrays, escapeString, escapeString, fail, fail, getFilePath, hasFlag, hasOtherFlags, parsePathParts, relativePathTo, splitQualifiedName, splitQualifiedName, stripJavaModifiers, stripNonJavaModifiers, stripPrivateModifier, unescapeString, vectorToArray, vectorToIntArray
 
Methods inherited from class java.lang.Object
finalize, getClass, notify, notifyAll, wait, wait, wait
 

Field Detail

isUpperBounded

private boolean isUpperBounded
Indicates whether the wildcard has been explicitely or implicitely upper bounded.


bound

private CClassType bound
The (upper or lower) bound of the wildcard. This is null if and only if the wildcard was declared without an explicit bound.


typeVariable

private CTypeVariable typeVariable
The formal type variable for which this wildcard is a type argument.

Constructor Detail

CWildcardType

private CWildcardType(boolean isUpperBounded,
                      CClassType bound)
Constructor for creating an eventually bounded wildcard. As not all combinations of parameters are meaningful, this constructor is declared to be private. That way, client code must use the provided static factory methods which indirectly invoke this constructor with the correct parameters.

Parameters:
isUpperBounded - Whether the wildcard is upper bounded (explicitly or implicitly) or not (i.e. lower bounded).
bound - The upper/lower bound (according to the flag isUpperBounded) of the wildcard or null if the wildcard is not bounded.
See Also:
createWildcard(), createUpperBoundedWildcard(CClassType), createLowerBoundedWildcard(CClassType)
Method Detail

createWildcard

public static CWildcardType createWildcard()
Creates a wildcard implicitely upper bounded by the java.lang.Object class.

Returns:
An implicitely upper bounded wildcard.

createUpperBoundedWildcard

public static CWildcardType createUpperBoundedWildcard(CClassType upperBound)
Creates an upper bounded wildcard with the given upperBound.

Parameters:
upperBound - The upper bound of the wildcard to create.
Returns:
A wildcard having the given upperBound.

createLowerBoundedWildcard

public static CWildcardType createLowerBoundedWildcard(CClassType lowerBound)
Creates a lower bounded wildcard with the given lowerBound.

Parameters:
lowerBound - The lower bound of the wildcard to create.
Returns:
A wildcard having the given lowerBound.

isWildcard

public boolean isWildcard()
Description copied from class: CType
Returns whether this is a wildcard type.

Overrides:
isWildcard in class CType

isBounded

public boolean isBounded()
Returns whether an explicit bound has been specified in the declaration of this wildcard.

Returns:
Whether this wildcard is explicitely bounded.
See Also:
createWildcard(), createUpperBoundedWildcard(CClassType), createLowerBoundedWildcard(CClassType)

isUpperBounded

public boolean isUpperBounded()
Returns whether this wildcard type has an explicit or implicit upper bound.

Returns:
Whether this wildcard is explicitely or implicitely upper bounded.

getBound

public CClassType getBound()
Returns the (upper or lower) bound of this wildcard which is null if and only if the wildcard was declared without an explicit bound.

Returns:
The bound of this wildcard.

getExplicitOrImplicitBound

public CClassType getExplicitOrImplicitBound()
Convenience method returning either the bound explicitely provided in the wildcard declaration, if any, or, otherwise, the implicit bound java.lang.Object.

Returns:
The explicit or implicit bound of this wildcard. Is never null.
See Also:
getBound(), isBounded()

contains

public boolean contains(CClassType type)
Description copied from class: CClassType
Returns whether this type contains the given type as defined in JLS3 4.5.1.1. This test is used when checking for the subtype relationship between two parametrized types. In order for a parametrized type to be a subtype of another, all type arguments of the former must be contained by the corresponding type arguments of the latter.

Overrides:
contains in class CClassType

isAlwaysAssignableTo

public boolean isAlwaysAssignableTo(CType dest)
This wildcard is assignable to the given type if and only if its capture type is assignable to it.

Overrides:
isAlwaysAssignableTo in class CClassType
See Also:
capture()

isAlwaysAssignableTo

public boolean isAlwaysAssignableTo(CType dest,
                                    boolean inst)
This wildcard is assignable to the given type if and only if its capture type is assignable to it.

Overrides:
isAlwaysAssignableTo in class CClassType
See Also:
capture()

isAlwaysAssignableTo

public boolean isAlwaysAssignableTo(CType dest,
                                    CClassType[] substitution)
This wildcard is assignable to the given type if and only if its capture type is assignable to it.

Overrides:
isAlwaysAssignableTo in class CClassType
See Also:
capture()

isAlwaysAssignableToNoUniverses

public boolean isAlwaysAssignableToNoUniverses(CType dest,
                                               CClassType[] substitution)
This wildcard is assignable to the given type if and only if its capture type is assignable to it.

Overrides:
isAlwaysAssignableToNoUniverses in class CClassType
See Also:
capture()

isValidTypeArgumentFor

public boolean isValidTypeArgumentFor(CTypeVariable typeVariable,
                                      CClassType[] substitution)
Description copied from class: CClassType
Returns whether this type is a valid type argument for the given typeVariable.

Overrides:
isValidTypeArgumentFor in class CClassType

equals

public boolean equals(Object other)
Description copied from class: CClassType
Compares two objects for equality.

Overrides:
equals in class CClassType

equals

public boolean equals(Object other,
                      boolean enableUniv)
Description copied from class: CClassType
Compares two objects for equality.

Overrides:
equals in class CClassType

equals

public boolean equals(CType other,
                      CClassType[] substitution)
Overrides:
equals in class CClassType

equals

public boolean equals(CType other,
                      CClassType[] substitution,
                      boolean enableUniv)
Overrides:
equals in class CClassType

getTypeVariable

public CTypeVariable getTypeVariable()
Returns the formal type variable for which this wildcard is a type argument.

Returns:
The type variable for which this wildcard is a type argument.

setTypeVariable

public void setTypeVariable(CTypeVariable typeVariable)
Sets the formal type variable for which this wildcard is a type argument.

Parameters:
typeVariable - The type variable for which this wildcard is a type argument.

checkType

public CType checkType(CContextType context)
                throws UnpositionedError
During type checking, the wildcard's optional bound is type checked, too. Note that, a non-null type variable must have been set on this wildcard via setTypeVariable(CTypeVariable) before invoking this method. Furthermore, this type variable must already have been type checked to be able to query its CClass.

Overrides:
checkType in class CClassType
Throws:
UnpositionedError

capture

public CClassType capture()
The capture type depends on the optional bound of the wildcard as well as on the formal type variable for which this wildcard is a type argument. Therefore, a non-null type variable must have been set on this wildcard via setTypeVariable(CTypeVariable) before invoking this method.

Overrides:
capture in class CClassType
Returns:
The capture type of this wildcard. Is never null.
See Also:
CCaptureType, getTypeVariable(), setTypeVariable(CTypeVariable)

appendSignature

public void appendSignature(FastStringBuffer buff)
Note that a non-generic signature should never be used for a wildcard since a wildcard is always a generic type argument. Therefore, an internal compiler error is triggered upon invoking this method in order to immediately indicate the misuse of this method.

Specified by:
appendSignature in interface CTypeSignatureAppender
Overrides:
appendSignature in class CClassType
See Also:
appendGenericSignature(FastStringBuffer)

appendGenericSignature

public void appendGenericSignature(FastStringBuffer buffer)
Specified by:
appendGenericSignature in interface CTypeSignatureAppender
Overrides:
appendGenericSignature in class CType

getErasure

public CType getErasure()
Returns the erasure of this wildcard's capture type.

Overrides:
getErasure in class CClassType
See Also:
capture()

toString

public String toString()
Description copied from class: CClassType
Transforms this type to a string

 also
 assignable loadedClassInfo, thisClassInfo;
 ensures \not_modified(loadedClassInfo);
 

Overrides:
toString in class CClassType

mjc

mjc is Copyright (C) 2000-2004 by Iowa State University and is distributed under the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. mjc is based in part on the Kopi project Copyright (C) 1990-99 DMS Decision Management Systems Ges.m.b.H.