Question 1. Consider the following classes:public class AnimalHouse<E> { private E animal; public void setAnimal(E x) { animal = x; } public E getAnimal() { return animal; } } public class Animal{ } public class Cat extends Animal { } public class Dog extends Animal { }For the following code snippets, identify whether the code:
- fails to compile,
- compiles with a warning,
- generates an error at runtime, or
- none of the above (compiles and runs without problem.)
Question 1a. AnimalHouse<Animal> house = new AnimalHouse<Cat>();Answer 1a: 1. fails to compileAnimalHouse<Cat>
andAnimalHouse<Animal>
are not compatible types, even thoughCat
is a subtype ofAnimal
.
Question 1b. AnimalHouse<Cat> house = new AnimalHouse<Animal>();Answer 1b: 1. fails to compileSame as 1a:AnimalHouse<Cat>
andAnimalHouse<Animal>
are not compatible types, even thoughCat
is a subtype ofAnimal
.
Question 1c. AnimalHouse<?> house = new AnimalHouse<Cat>(); house.setAnimal(new Cat());Answer 1c: 1. fails to compileWhile the first line is acceptable it is OK to define an instance of unknown type the compiler doesn't know the type of animal stored inhouse
so thesetAnimal
method cannot be used.
Question 1d. AnimalHouse house = new AnimalHouse(); house.setAnimal(new Dog());Answer 1d: 2. compiles with a warningThe compiler doesn't know what typehouse
contains. It will accept the code, but warn that there might be a problem when setting the animal to an instance ofDog
.Using a generic type as a raw type might be a way to work around a particular compiler error, but you lose the type checking that generics provides, so it is not recommended.
Exercise 1. Design a class that acts as a library for the following kinds of media: book, video, and newspaper. Provide one version of the class that uses generics and one that does not. Feel free to use any additional APIs for storing and retrieving the media.Answer 1:
Non-Generic Version
import java.util.List; import java.util.ArrayList; public class Library { private List resources = new ArrayList(); public void addMedia(Media x) { resources.add(x); } public Media retrieveLast() { int size = resources.size(); if (size > 0) { return (Media)resources.get(size - 1); } return null; } } interface Media { } interface Book extends Media { } interface Video extends Media { } interface Newspaper extends Media { }Generic Version
import java.util.List; import java.util.ArrayList; public class Library<E extends Media> { private List<E> resources = new ArrayList<E>(); public void addMedia(E x) { resources.add(x); } public E retrieveLast() { int size = resources.size(); if (size > 0) { return resources.get(size - 1); } return null; } }