What will be the result of attempting to compile the following code?
class Vehicle { } class Car extends Vehicle { } class Sedan extends Car { } class Garage<V> { private V v;// w w w. j a v a 2 s . c o m public V get() { return this.v; } public void put(V v) { this.v = v; } } public class Main { private Object object = new Object(); private Vehicle vehicle = new Vehicle(); private Car car = new Car(); private Sedan sedan = new Sedan(); public void doD(Garage<? extends Car> g) { g.put(object); // (1) g.put(vehicle); // (2) g.put(car); // (3) g.put(sedan); // (4) object = g.get(); // (5) vehicle = g.get(); // (6) car = g.get(); // (7) sedan = g.get(); // (8) } }
Select the one correct answer.
put()
method in statements (1) - (2) will compile.put()
method in statements (3) - (4) will compile.(c)
The type of reference g is of type Garage<? extends Car>.
We cannot put any car in such a garage, and can only get a Car (or its super type) out.
The type of value returned by the get()
method in statement (8) is (capture-of ? extends Car).
Some unknown subtype of Car and, therefore, not compatible for assignment to Sedan, as the value might turn out be of a type totally unrelated to Sedan.