Java OCA OCP Practice Question 2316

Question

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.

  • (a) The call to the put() method in statements (1) - (2) will compile.
  • (b) The call to the put() method in statements (3) - (4) will compile.
  • (c) The assignment statements (5), (6), and (7) will compile.
  • (d) The assignment statement (8) will compile.


(c)

Note

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.




PreviousNext

Related