Для создания универсального хранилища, которое может содержать объекты любых классов-наследников базового класса (например, `Item`), можно использовать `Map<Class<? extends Item>, List<Item>>`. Это позволит хранить объекты каждого из наследников `Item` в отдельном списке, и по классу можно будет быстро определить, где хранятся объекты этого класса.
Давайте рассмотрим пример:
```java
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import
java.util.Map ;
class Item {
// Основные свойства и методы класса Item
}
class Weapon extends Item {
// Свойства и методы класса Weapon
}
class Armor extends Item {
// Свойства и методы класса Armor
}
class UniversalStorage {
private Map<Class<? extends Item>, List<Item>> storage = new HashMap<>();
public <T extends Item> void addItem(T item) {
storage
.computeIfAbsent(item.getClass(), k -> new ArrayList<>())
.add(item);
}
public <T extends Item> List<T> getItems(Class<T> cls) {
return (List<T>) storage.getOrDefault(cls, new ArrayList<>());
}
}
public class Main {
public static void main(String[] args) {
UniversalStorage storage = new UniversalStorage();
storage.addItem(new Weapon());
storage.addItem(new Armor());
storage.addItem(new Armor());
System.out.println(storage.getItems(Weapon.class).size()); // 1
System.out.println(storage.getItems(Armor.class).size()); // 2
}
}
```
Здесь `UniversalStorage` использует хэш-карту для хранения объектов каждого из классов-наследников `Item`. Вы можете легко добавлять объекты в хранилище с помощью метода `addItem` и извлекать их с помощью метода `getItems`, передавая класс объектов, которые вы хотите получить.
Однако стоит учитывать, что приведенный пример имеет определенные ограничения и может потребовать доработки в зависимости от ваших конкретных потребностей.