@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;
    }
  • Вопрос задан
  • 103 просмотра
Решения вопроса 2
@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
Ответ написан
Bavashi
@Bavashi
Дополню примером:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.*;

public class Main
{
	public static void main(String[] args) {
		
		Cage<Cat> myCat = new Cage<Cat>();
		myCat.animals.put(1, new Cat());
		myCat.animals.put(2, new Cat());
		System.out.println(myCat.getLegsAmount());
		
		//----
		
		Cage<Dog> myDog = new Cage<Dog>();
		myDog.animals.put(1, new Dog());
		myDog.animals.put(2, new Dog());
		System.out.println(myDog.getLegsAmount());
		
	}
}

public class Cage <T> {
    public HashMap<Integer, T> animals; //Лень было писать интерфейсный метод, поэтому для теста public
    private Animal allAnimals;
    
    public <T> Cage() {
        animals = new HashMap();
    }
    
public int getLegsAmount()
{
        int amount = 0;
        Iterator iterator = animals.entrySet().iterator();
        while (iterator.hasNext()) {
             Map.Entry animal = (Map.Entry) iterator.next();
             allAnimals = (Animal) animal.getValue();
             amount += allAnimals.getLegsNumber();
        }
        
        return amount;
    }
}

public class Animal {
    public int getLegsNumber() {return 1;}
}
public class Cat extends Animal {
    public int getLegsNumber() {return 2;}
}
public class Dog extends Animal {
    public int getLegsNumber() {return 3;}
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
XCritical Software Санкт-Петербург
До 370 000 ₽
от 150 000 до 200 000 ₽
MediaSoft Ульяновск
от 80 000 до 150 000 ₽
25 окт. 2020, в 11:50
3000 руб./за проект
25 окт. 2020, в 11:42
3000 руб./за проект
25 окт. 2020, в 10:25
6000 руб./за проект