Aren't <U, T extends U> and <T, U super T> the same?
collections, generics, java, type-parameter
Solution
- Type parameters (your example) can only use extends (JLS #4.4):
TypeParameter:
TypeVariable TypeBoundopt
TypeBound:
extends TypeVariable
extends ClassOrInterfaceType AdditionalBoundListopt
AdditionalBoundList:
AdditionalBound AdditionalBoundList
AdditionalBound
AdditionalBound:
& InterfaceType
- Wildcards can use either `extends` or `super` (JLS #4.5.1):
TypeArguments:
< TypeArgumentList >
TypeArgumentList:
TypeArgument
TypeArgumentList , TypeArgument
TypeArgument:
ReferenceType
Wildcard
Wildcard:
? WildcardBoundsopt
WildcardBounds:
extends ReferenceType
super ReferenceType
Problem
I have a confusion in following two method declarations: ``` private <U, T extends U> T funWorks(T child, U parent) { // No compilation errors } private <T, U super T> T funNotWorks(T child, U parent) { // compilation errors } ``` Shouldn't both of the above be valid? With the analogy of If U is parent of T , then T is child of U. Then why does 2nd one gives compilation error? EDIT:: I think , `T extends T` and `T super T` both are valid. right ?