Reputation: 16202
Why is it that a generic T
cannot be used as a return type of class
if T extends Class
.
Example:
public class Foo<T extends Bar> {
Bar[] array = new Bar[200];
Optional<T> forIndex(int index) {
return Optional.ofNullable(array[index]);
}
}
T
is required to extend Bar
Which means that T
should never have a casting problem, or am I mistaking this? Could somebody elaborate.
Upvotes: 3
Views: 84
Reputation: 20195
You got it the wrong way around. Each T
is a Bar
, but not each Bar
is a T
. T
is more specialized than Bar
(each dachshound is a dog, but not each dog is a dachshound). This means, that return Optional.ofNullable(array[index]);
tries to match a Bar
on a T
, which is not possible.
What you can do is making only the method generic:
public class Main {
Bar[] array = new Bar[200];
Optional<? super Bar> forIndex(int index) {
return Optional.ofNullable(array[index]);
}
}
You might want to look at Oracle's tutorial on Wildcards as well as the PECS (Producer extends
- Consumer super
) mnemonic
Upvotes: 5