Name: ____________________________________________________ Alpha: _____________________

Describe help received: _________________________________________________________________

  1. [30pts] Consider the following program HWa:
    import java.util.*;
    
    public class HWa
    {
      public static class APair
      {
        Object x, y;
        public APair(Object o1, Object o2)
        {
          x = o1;
          y = o2;
        }
        public Object first() { return x; }
        public Object second() { return y; }
      }
    
      public static class BPair<T>
      {
        T x, y;
        public BPair(T o1, T o2)
        {
          x = o1;
          y = o2;
        }
        public T first() { return x; }
        public T second() { return y; }
      }
    
      public interface Fooable
      {
        public String foo();
      }
    
      public static class CPair
      {
        Fooable x, y;
        public CPair(Fooable o1, Fooable o2)
        {
          x = o1;
          y = o2;
        }
        public Fooable first() { return x; }
        public Fooable second() { return y; }
      }
    
      public static class Bat implements Fooable
      {
        int val;
        public Bat(int k) { val = k; }
        public String foo() { return "Bat" + val; }
        public int bar() { return val*val; }
      }
    
      public static class Pig implements Fooable
      {
        String lab;
        public Pig(String s) { lab = s; }
        public String foo() { return "Pig" + lab; }
      }
      
      public static void main(String[] args)
      {
        APair a = new APair(new Bat(7), new Pig("Q"));
        BPair<Bat> b = new BPair<Bat>(new Bat(8), new Bat(9));
        CPair c = new CPair(new Bat(5), new Pig("Z"));;
      }
    }
    Give the statement(s) we'd have to add to the end of main() in order to:
    1. call foo() on first of a ______________________
    2. call foo() on first of b ______________________
    3. call foo() on first of c ______________________
    1. call bar() on first of a ______________________
    2. call bar() on first of b ______________________
    3. call bar() on first of c ______________________
  2. [30pts] Consider b in main above. Why would it have been wrong to initialize it like this:
    BPair<Bat> b = new BPair<Bat>(new Bat(8), new Pig("Z"));
    How could you define b as a BPair in such a way as to allow one to initialize it with (new Bat(8), new Pig("Z"))?
  3. [40pts] The question "Does Java support multiple inheritance?" does not have a straight forward yes/no answer. Give a thorough and nuanced response to it.