Class JIntersectionType
- java.lang.Object
-
- net.sourceforge.pmd.lang.java.types.JIntersectionType
-
- All Implemented Interfaces:
JTypeMirror
,JTypeVisitable
public final class JIntersectionType extends Object implements JTypeMirror
An intersection type. Intersections type act as the greatest lower bound for a set of types.https://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.9
-
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description <T,P>
TacceptVisitor(JTypeVisitor<T,P> visitor, P p)
Accept a type visitor, dispatching on this object's runtime type to the correct method of the visitor.boolean
equals(Object o)
Returns true if the object is a type equivalent to this one.List<JTypeMirror>
getComponents()
Returns the list of components.JTypeMirror
getErasure()
Returns the erasure of this type.@Nullable JClassType
getInducedClassType()
Every intersection type induces a notional class or interface for the purpose of identifying its members.@NonNull List<JClassType>
getInterfaces()
Returns all additional bounds on the primary bound, which are necessarily interface types.@NonNull JTypeMirror
getPrimaryBound()
The primary bound of this intersection, which may be a type variable, array type, or class type (not an interface).@Nullable JTypeDeclSymbol
getSymbol()
Returns the symbol declaring this type.org.pcollections.PSet<SymbolicValue.SymAnnot>
getTypeAnnotations()
Return a list of annotations on this type.TypeSystem
getTypeSystem()
Returns the type system that built this type.int
hashCode()
Stream<JMethodSig>
streamMethods(Predicate<? super JMethodSymbol> prefilter)
Returns a stream of method signatures declared in and inherited by this type.JIntersectionType
subst(Function<? super SubstVar,? extends @NonNull JTypeMirror> subst)
Replace the type variables occurring in the given type by their image by the given function.String
toString()
The toString of type mirrors prints useful debug information, but shouldn't be relied on anywhere, as it may change anytime.JTypeMirror
withAnnotations(org.pcollections.PSet<SymbolicValue.SymAnnot> newTypeAnnots)
Returns a type mirror that is equal to this instance but has different type annotations.-
Methods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
-
Methods inherited from interface net.sourceforge.pmd.lang.java.types.JTypeMirror
addAnnotation, box, getAsSuper, getConstructors, getSuperTypeSet, isArray, isBottom, isBoxedPrimitive, isClassOrInterface, isConvertibleTo, isFloatingPoint, isGeneric, isGenericTypeDeclaration, isIntegral, isInterface, isNumeric, isParameterizedType, isPrimitive, isPrimitive, isRaw, isReifiable, isSubtypeOf, isTop, isTypeVariable, isVoid, streamDeclaredMethods, unbox
-
-
-
-
Method Detail
-
getTypeAnnotations
public org.pcollections.PSet<SymbolicValue.SymAnnot> getTypeAnnotations()
Description copied from interface:JTypeMirror
Return a list of annotations on this type. Annotations can be written on nearly any type (eg@A Out.@B In<@C T>
,@A ? extends @B Up
).For
JTypeVar
, this includes both the annotations defined on the type var and those defined at use site. For instance
The T type var will have annotation<@A T> void accept(@B T t);
@A
in the symbol (AnnotableSymbol.getDeclaredAnnotations()
) and in the type var that is in theJMethodSig.getTypeParameters()
. In the formal parameter, the type var will have annotations@B @A
.- Specified by:
getTypeAnnotations
in interfaceJTypeMirror
-
withAnnotations
public JTypeMirror withAnnotations(org.pcollections.PSet<SymbolicValue.SymAnnot> newTypeAnnots)
Description copied from interface:JTypeMirror
Returns a type mirror that is equal to this instance but has different type annotations. Note that some types ignore this method and return themselves without changing. Eg the null type cannot be annotated.- Specified by:
withAnnotations
in interfaceJTypeMirror
- Parameters:
newTypeAnnots
- New type annotations (not null)- Returns:
- A new type, maybe this one
-
getComponents
public List<JTypeMirror> getComponents()
Returns the list of components. Their erasure must be pairwise disjoint. If the intersection's superclass isTypeSystem.OBJECT
, then it is excluded from this set.
-
getPrimaryBound
public @NonNull JTypeMirror getPrimaryBound()
The primary bound of this intersection, which may be a type variable, array type, or class type (not an interface). If all bounds are interfaces, then this returnsTypeSystem.OBJECT
.
-
getInterfaces
public @NonNull List<JClassType> getInterfaces()
Returns all additional bounds on the primary bound, which are necessarily interface types.
-
getInducedClassType
public @Nullable JClassType getInducedClassType()
Every intersection type induces a notional class or interface for the purpose of identifying its members. This may be a functional interface. This returns null for the non-implemented cases.This is only relevant to check for functional interface parameterization, eg
Runnable & Serializable
. Do not use this to find out the members of this type, rather, usestreamMethods(Predicate)
or so.
-
acceptVisitor
public <T,P> T acceptVisitor(JTypeVisitor<T,P> visitor, P p)
Description copied from interface:JTypeVisitable
Accept a type visitor, dispatching on this object's runtime type to the correct method of the visitor.- Specified by:
acceptVisitor
in interfaceJTypeVisitable
- Type Parameters:
T
- Type of result of the visitorP
- Type of data of the visitor
-
streamMethods
public Stream<JMethodSig> streamMethods(Predicate<? super JMethodSymbol> prefilter)
Description copied from interface:JTypeMirror
Returns a stream of method signatures declared in and inherited by this type. Method signatures are created on-demand by this method, they're not reused between calls. This stream does not include constructors.Note: streams are a bit impractical when it comes to configuring the filter. Possibly a specialized API should be introduced. We need to support the use cases of the symbol table, ie filter by name + accessibility + staticity, and also possibly use cases for rules, like getting a method from a known signature. See also
JClassType.getDeclaredMethod(JExecutableSymbol)
, which looks like this. Unifying this API would be nice.- Specified by:
streamMethods
in interfaceJTypeMirror
- Parameters:
prefilter
- Filter selecting symbols for which a signature should be created and yielded by the stream
-
subst
public JIntersectionType subst(Function<? super SubstVar,? extends @NonNull JTypeMirror> subst)
Description copied from interface:JTypeVisitable
Replace the type variables occurring in the given type by their image by the given function. Substitutions are not applied recursively (ie, is not applied on the result of a substitution).- Specified by:
subst
in interfaceJTypeMirror
- Specified by:
subst
in interfaceJTypeVisitable
- Parameters:
subst
- Substitution function, eg aSubstitution
-
getSymbol
public @Nullable JTypeDeclSymbol getSymbol()
Description copied from interface:JTypeMirror
Returns the symbol declaring this type. Reifiable types present a symbol, and some other types too. This method's return value depends on this type:JClassType
: aJClassSymbol
, always (even if not reifiable)JPrimitiveType
: aJClassSymbol
, alwaysJArrayType
: aJClassSymbol
, if the element type does present a symbol.JTypeVar
: aJTypeParameterSymbol
, or null if this is a capture variable. Note that the erasure yields a different symbol (eg Object for unbounded tvars).JIntersectionType
: null, though their erasure always presents a symbol.JWildcardType
,the null type
: null, always
Note that type annotations are not reflected on the symbol, but only on the type.
- Specified by:
getSymbol
in interfaceJTypeMirror
-
getTypeSystem
public TypeSystem getTypeSystem()
Description copied from interface:JTypeMirror
Returns the type system that built this type.- Specified by:
getTypeSystem
in interfaceJTypeMirror
-
getErasure
public JTypeMirror getErasure()
Description copied from interface:JTypeMirror
Returns the erasure of this type. Erasure is defined by JLS§4.6, an adapted definition follows:- The erasure of a parameterized type (§4.5) G<T1,...,Tn> is |G|.
- The erasure of a nested type T.C is |T|.C.
- The erasure of an array type T[] is |T|[].
- The erasure of a type variable (§4.4) is the erasure of its upper bound.
- The erasure of an intersection type is the erasure of its leftmost component.
- The erasure of every other type is the type itself.
The JVM representation of a type is in general the symbol of its erasure. So to get a
Class
instance for the runtime representation of a type, you should dot.getErasure().getSymbol()
. The erasure procedure gets rid of types that have no symbol (except ift
is a wildcard type, or theTypeSystem.NULL_TYPE
)- Specified by:
getErasure
in interfaceJTypeMirror
-
toString
public String toString()
Description copied from interface:JTypeMirror
The toString of type mirrors prints useful debug information, but shouldn't be relied on anywhere, as it may change anytime. UseTypePrettyPrint
to display types.- Specified by:
toString
in interfaceJTypeMirror
- Overrides:
toString
in classObject
-
equals
public boolean equals(Object o)
Description copied from interface:JTypeMirror
Returns true if the object is a type equivalent to this one. A few kinds of types use reference identity, like captured type variables, or the null type. A few special types are represented by constants (seeTypeSystem
). Apart from those, types should always be compared using this method. orTypeOps.isSameType(JTypeMirror, JTypeMirror)
(which is null-safe).Note that types belonging to different type systems do not test equal. The type system object is global to the analysis though, so this should not ever happen in rules.
- Specified by:
equals
in interfaceJTypeMirror
- Overrides:
equals
in classObject
- Parameters:
o
-- Returns:
-
-