Карта броска Явыдля объекта - PullRequest
0 голосов
/ 16 октября 2018

Имеет функцию, которая принимает тип Object в качестве параметра, я хочу использовать эту функцию, передав переменную Map<String, String>.К сожалению, есть жалобы на это.Есть ли способ разыграть Map<String, String> до Object?Я думал, что любой тип класса может быть автоматически приведен к Object, так как Object является суперклассом всего.

Это код:

private GeometryWithTags getRouteGeometryWithTags(Route route)
{
    Map<String, Map<String, String>> edgesTags = new HashMap<>();
        Iterator<Edge> edgeIterator = route.iterator();
        while (edgeIterator.hasNext())
        {
            Edge edge = edgeIterator.next();
            edgesTags.put(new Long(edge.getIdentifier()).toString(), edge.getTags());
        }
        return new GeometryWithTags(route.asPolyLine(), edgesTags);
    }

ошибка: несовместимые типы: Карта> не может быть преобразована в Карту, возвращают новые GeometryWithTags (route.asPolyLine () ,dgeTags);

1 Ответ

0 голосов
/ 16 октября 2018

Причина, по которой Map<String, Map<String, String>> не может быть преобразована в Map<String, Object>, заключается в том, что последний может делать то, что первый не может.Рассмотрим

Map<String, Map<String, String>> myStringMap = new HashMap<>();
Map<String, Object> myObjectMap = myStringMap; // Not allowed, but suppose it were
myObjectMap.put("key", new Integer(10));
// Now myStringMap contains an integer,
// which is decidedly *not* a Map<String, String>

Если бы это было разрешено, то вызов .put не выполнялся бы во время выполнения, поэтому такая ситуация запрещена системой типов.Если GeometryWithTags является классом, которым вы управляете, и он на самом деле никогда ничего не добавляет на карту, вы должны использовать шаблон PECS

GeometryWithTags(Map<String, ? extends Object> map) { ... }

Теперь у нас есть карта, которая может иметь любое значениевведите, но мы гарантируем, что мы ничего не сможем добавить (поскольку ? может быть несовместимо с добавленным значением).

Если GeometryWithTags должна быть возможность изменить карту, или еслиу вас нет контроля над классом, тогда вам нужно изначально создать Map<String, Object>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...