Java OCA OCP Practice Question 2318

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;/*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.

  • (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 statement (5) will compile.
  • (d) The assignment statements (6), (7), and (8) will compile.


(b) and (c)

Note

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.




PreviousNext

Related