Today I tried to write a class with a generic method that uses intersection types and got confused by the different error messages depending on the intersected types. Let\'s
This is explained in the section 4.4 Type Variables of The Java Language specification
A type variable is an unqualified identifier used as a type in class, interface, method, and constructor bodies.
A type variable is introduced by the declaration of a type parameter of a generic class, interface, method, or constructor (§8.1.2, §9.1.2, §8.4.4, §8.8.4).
TypeParameter: {TypeParameterModifier} TypeIdentifier [TypeBound] TypeParameterModifier: Annotation TypeBound: extends TypeVariable extends ClassOrInterfaceType {AdditionalBound} AdditionalBound: & InterfaceType
The scope of a type variable declared as type parameter is specified in §6.3.
Every type variable declared as a type parameter has a bound. If no bound is declared for a type variable, Object is assumed. If a bound is declared, it consists of either:
- a single type variable
T
, or- a class or interface type
T
possibly followed by interface typesI1 & ... & In
.It is a compile-time error if any of the types
I1 ... In
is a class type or type variable.The erasures (§4.6) of all constituent types of a bound must be pairwise different, or a compile-time error occurs.
A type variable must not at the same time be a subtype of two interface types which are different parameterizations of the same generic interface, or a compile-time error occurs.
The order of types in a bound is only significant in that the erasure of a type variable is determined by the first type in its bound, and that a class type or type variable may only appear in the first position.
The members of a type variable
X
with boundT & I1 & ... & In
are the members of the intersection type (§4.9)T & I1 & ... & In
appearing at the point where the type variable is declared.
You can only have 1 class but have multiple interfaces. If you have a class it must be the first one specified. If you follow this rule, you shouldn't get any compiling errors.
See https://docs.oracle.com/javase/tutorial/java/generics/bounded.html