Suppose we want to write a generic method which takes a list and print it only when it contains elements subclassing one particular class. So here we need upper bound.
It is possible to set the upper bound of the wildcard like this:
In this example I have specified the upper bound to be the class
As you can see it is now safe to cast each element in the list to a
Furthermore, it is now safe to call the method using a
But, even when using a wildcard with an upper bound it is not safe to write to the
The type parameterization <? extends E> is called an "upper bounded wildcard" because it defines a type that could be any type so long as it is bounded by the superclass E. It provides covariant relationship such that the referenced object's (eg. Car ) type parameter is a subclass ofVehicle's type parameter
It is possible to set the upper bound of the wildcard like this:
List<? extends Vehicle> vehicles = new ArrayList<? extends Vehicle>();
In this example I have specified the upper bound to be the class
Vehicle
. I can now define the printElements()
method like this:public void printElements(List<? extends Vehicle> elements){
for(Vehicle o : elements){
System.out.println(o);
}
}
As you can see it is now safe to cast each element in the list to a
Vehicle
, as it is done by the new for loop inside the method. Furthermore, it is now safe to call the method using a
List<Car>
instance, provided that Car
extends Vehicle
. Here is an example: List<Car> elements = new ArrayList<Car>
// ... add Car elements to the list.
printElements(elements);
But, even when using a wildcard with an upper bound it is not safe to write to the
List
. After all, a Car
is always a Vehicle
, but a Vehicle
is not always a Car
.The type parameterization <? extends E> is called an "upper bounded wildcard" because it defines a type that could be any type so long as it is bounded by the superclass E. It provides covariant relationship such that the referenced object's (eg. Car ) type parameter is a subclass ofVehicle's type parameter
No comments:
Post a Comment