T extends Animal
Но в таком случае я могу складывать в HashMap и Dog, и Cat, а нужно хранить объекты только одного класса.
Это правильное решение, т.к. все равно хранить можно будет только объекты класса, которым параметризирован объект класса Cage, то есть в
Cage<Dog>
не получится сохранить объект класса
Cat
.
Но все равно будет ругаться на T в цикле из-за того что переменная не параметризирована, нужно:
private HashMap<Long, T> animals;
а вот уже присваивать можно и без этого:
public Cage() {
animals = new HashMap<>();
}
или вообще без конструктора :
private HashMap<Long, T> animals = new HashMap<>();
Для примера можно добавить метод save:
public void save(Long k, T v) {
animals.put(k, v);
}
Если попробовать создать объект класса Cage, параметризированный классом Cat, и сохранить туда Dog, такое просто не скомпилируется:
Cage<Cat> catCage = new Cage<>();
catCage.save(1L, new Cat());
catCage.save(2L, new Dog());
Required type: Cat
Provided: Dog