/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* Represents a Java reference type, such as a class, an interface,
* an enum, an array type, a parameterized type.
*
* <p>
* To be exact, this object represents an "use" of a reference type,
* not necessarily a declaration of it, which is modeled as {@link JDefinedClass}.
*/
{
}
/**
* Gets the name of this class.
*
* @return
* name of this class, without any qualification.
* For example, this method returns "String" for
* <code>java.lang.String</code>.
*/
/**
* Gets the package to which this class belongs.
* TODO: shall we move move this down?
*/
/**
* Returns the class in which this class is nested, or <tt>null</tt> if
* this is a top-level class.
*/
return null;
}
/** Gets the JCodeModel object to which this object belongs. */
/**
* Gets the super class of this class.
*
* @return
* Returns the JClass representing the superclass of the
* entity (class or interface) represented by this {@link JClass}.
* Even if no super class is given explicitly or this {@link JClass}
* is not a class, this method still returns
* {@link JClass} for {@link Object}.
* If this JClass represents {@link Object}, return null.
*/
/**
* Iterates all super interfaces directly implemented by
*
* @return
* A non-null valid iterator that iterates all
* {@link JClass} objects that represents those interfaces
* implemented by this object.
*/
/**
*
* <p>
* For example, if this {@link JClass} represents
* <code>Set<T></code>, this method returns an array
* that contains single {@link JTypeVar} for 'T'.
*/
return EMPTY_ARRAY;
}
/**
* Sometimes useful reusable empty array.
*/
/**
* Checks if this object represents an interface.
*/
abstract public boolean isInterface();
/**
* Checks if this class is an abstract class.
*/
abstract public boolean isAbstract();
/**
* If this class represents one of the wrapper classes
* defined in the java.lang package, return the corresponding
* primitive type. Otherwise null.
*/
/**
* @deprecated calling this method from {@link JClass}
* would be meaningless, since it's always guaranteed to
* return <tt>this</tt>.
*/
}
return this;
}
/**
* Checks the relationship between two classes.
* <p>
* This method works in the same way as {@link Class#isAssignableFrom(Class)}
* works. For example, baseClass.isAssignableFrom(derivedClass)==true.
*/
// to avoid the confusion, always use "this" explicitly in this method.
// null can be assigned to any type.
if( this==derived ) return true;
// the only class that is assignable from an interface is
// java.lang.Object
if( b!=null && this.isAssignableFrom(b) )
return true;
if( this.isInterface() ) {
return true;
}
return false;
}
/**
* Gets the parameterization of the given base type.
*
* <p>
* For example, given the following
* <pre><xmp>
* interface Foo<T> extends List<List<T>> {}
* interface Bar extends Foo<String> {}
* </xmp></pre>
* This method works like this:
* <pre><xmp>
* getBaseClass( Bar, List ) = List<List<String>
* getBaseClass( Bar, Foo ) = Foo<String>
* getBaseClass( Foo<? extends Number>, Collection ) = Collection<List<? extends Number>>
* getBaseClass( ArrayList<? extends BigInteger>, List ) = List<? extends BigInteger>
* </xmp></pre>
*
* @param baseType
* The class whose parameterization we are interested in.
* @return
* The use of {@code baseType} in {@code this} type.
* or null if the type is not assignable to the base type.
*/
return this;
if( b!=null ) {
return bc;
}
return bc;
}
return null;
}
}
if(arrayClass==null)
return arrayClass;
}
/**
* "Narrows" a generic class to a concrete class by specifying
* a type argument.
*
* <p>
* <code>.narrow(X)</code> builds <code>Set<X></code> from <code>Set</code>.
*/
}
return narrow(r);
}
/**
* "Narrows" a generic class to a concrete class by specifying
* a type argument.
*
* <p>
* <code>.narrow(X)</code> builds <code>Set<X></code> from <code>Set</code>.
*/
return new JNarrowedClass(this,clazz);
}
}
}
}
/**
* If this class is parameterized, return the type parameter of the given index.
*/
return Collections.emptyList();
}
/**
* Returns true if this class is a parameterized class.
*/
public final boolean isParameterized() {
return erasure()!=this;
}
/**
* Create "? extends T" from T.
*
* @return never null
*/
return new JTypeWildcard(this);
}
/**
* Substitutes the type variables with their actual arguments.
*
* <p>
* For example, when this class is Map<String,Map<V>>,
* (where V then doing
* substituteParams( V, Integer ) returns a {@link JClass}
* for <code>Map<String,Map<Integer>></code>.
*
* <p>
* This method needs to work recursively.
*/
}
}
/** Generates a static method invocation. */
return new JInvocation(this,method);
}
/** Generates a static method invocation. */
return new JInvocation(this,method);
}
/** Static field reference. */
}
/** Static field reference. */
}
f.t(this);
}
/**
* Prints the class name in javadoc @link format.
*/
f.p("{@link ").g(this).p('}');
}
}