Задать вопрос
@dostanu

Как задать тип для HashMap при создании класса с помощью дженерика?

Хочу создать класс Cage, в котором в HashMap'e я смогу хранить только один тип животного. Пробовал передавать желаемый тип в конструктор, задавать T для класса, для каждого метода. Везде одна ошибка - "Cannot resolve method 'getLegsNumber' in 'T'". То есть метод не знает, что тип Т является Animal и трактует его как Object. Единственный случай когда ошибка НЕ возникает - объявление класса:
public class Cage <T extends Animal>.
Но в таком случае я могу складывать в HashMap и Dog, и Cat, а нужно хранить объекты только одного класса.

public class Cage <T> {
    private HashMap animals;

    public <T> Cage() {
        animals = new HashMap<Long, T>();
    }
public int getLegsAmount()
    {
        int amount = 0;

        for (T animal : animals.values())
            amount += animal.getLegsNumber();
        return amount;
    }
  • Вопрос задан
  • 175 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@Cheypnow
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
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы