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;/*from w w w. j a v a2 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 doE(Garage<? super 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 two correct answers.
put()
method in statements (1) - (2) will compile.put()
method in statements (3) - (4) will compile.(b) and (c)
The type of reference g is of type Garage<? super Car>.
We can put a Car (or its sub- type) in such a garage, but can only get Objects out.
The type of value returned by the get()
method in statements (6)-(8) is (capture-of ? super Car).
Some super- type of Car and, therefore, not compatible for assignment to Vehicle, Car, and Sedan, as it might be a value of a super type of Vehicle, Car, or Sedan, respectively.