У меня есть абстрактный класс с именем BaseCode
и 2 конкретных класса с именами Location
и Department
:
public abstract class BaseCode {
private Integer id;
...
public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
...
}
public class Location extends BaseCode {
...
}
public class Department extends BaseCode {
...
}
У меня есть абстрактный класс с именем BaseCodeCache
и 2 конкретных класса с именами LocationCache
и DepartmentCache
. LocationCache
и DepartmentCache
будут использовать Singleton
.
public abstract class BaseCodeCache {
...
}
public class LocationCache extends BaseCodeCache {
...
}
public class DepartmentCache extends BaseCodeCache {
...
}
- В
BaseCodeCache
я хочу иметьjava.util.Map
, значение которого может быть любым типомBaseCode
, то естьLocation
объектов илиDepartment
объектов.
ВLocationCache
я хочу, чтобыjava.util.Map
хранилоLocation
объектов.
ВDepartmentCache
я хочу, чтобыjava.util.Map
хранилDepartment
объектов.
Для этого я поместил этот код в BaseCodeCache
:
private Map<Integer, BaseCode> idMap = new HashMap<Integer, BaseCode>();
- Я хочу иметь метод для хранения значения в
java.util.Map
.
Для этого я поместил этот код в BaseCodeCache
:
public void add(BaseCode baseCode) {
if (baseCode != null) {
idMap.put(baseCode.getId(), baseCode);
}
}
Вот как я бы использовал его для Location
:
Location location = new Location(); ...
LocationCache.getInstance().add(location);
Вот как я бы использовал его для Department
:
Department department = new Department(); ...
DepartmentCache.getInstance().add(department);
- Я хочу иметь метод для получения всех значений в
java.util.Map
какjava.util.List
.
ВLocationCache
этот метод должен возвращатьList<Location>
.
ВDepartmentCache
этот метод должен возвращатьList<Department>
.
Вот где я застрял. Я хочу создать этот метод в BaseCodeCache
, но когда этот метод вызывается через LocationCache
, он возвращает List<Location>
, а когда тот же метод вызывается через DepartmentCache
, он возвращает List<Department>
. Возможно ли это?
Я поместил этот код в BaseCodeCache
:
public List<BaseCode> getList() {
return new ArrayList<BaseCode>(idMap.values());
}
Но приведенный выше код возвращает List<BaseCode>
. Когда я бы назвал это так:
List<Location> allLocations = LocationCache.getInstance().getList();
Тогда java не позволит ему скомпилироваться и выдаст это сообщение об ошибке:
Несоответствие типов: невозможно преобразовать
List<BaseCode>
вList<Location>
Я могу исправить это, получив List<BaseCode>
, а затем преобразовав его в List<Location>
с помощью цикла, но это выглядит неправильно.
Можно ли это сделать?