Как получить значения указанных c полей на карте - PullRequest
0 голосов
/ 16 июня 2020

У меня есть что-то вроде:

Map<String, Object> hashMap;

Когда я делаю что-то вроде:

hashMap.get("binary"), I get value as: {size=5642, name=abc}

Здесь key является двоичным, а value является объектом типа Object и является {size = 5642, name = abc}

Обратите внимание, что значения не принадлежат определенному классу. В Python я могу сделать что-то вроде hashMap["binary"]["size"], мне было интересно, что будет эквивалентом в java

Как мне получить значение size напрямую, не анализируя указанную выше строку?

1 Ответ

2 голосов
/ 16 июня 2020

Значение не относится к типу Object, а к некоторому типу, который расширяется от Object (в java все неявно расширяет Object). Назовем его «X»

Теперь он не работает как python, потому что, в отличие от python java, не имеет такой динамики c.

{size=5642, name=abc} - это, вероятно, строковое представление этого типа X. Это то, что вы видите в отладчике или, может быть, при попытке распечатать значение на консоли с помощью System.out.println или чего-то еще.

Теперь сначала выясните, какой тип это:

Object value = hashMap.get("binary")
System.out.println(value.getClass().getName());

Он напечатает имя класса

Затем проверьте источник этого класса, возможно, это выглядит так:

public class X {
   private final int size;
   private final String name;

   ... // constructor, other stuff maybe


   // these are called "getters" in java world
   public int getSize() {return size;}
   public String getName() {return name;}
}

С этого момента у вас есть 2 способа получить размер:

Object value = hashMap.get("binary");
int size = ((X)value).getSize();  // This is called downcasting

Недостатком этого метода является то, что вы не используете возможности дженериков

Так что лучшим вариантом будет рефакторинг, если это возможно конечно:

Map<String, X> hashMap = ...
X value = hashMap.get("binary");
value.getSize();

Последнее замечание:

Если случится, что значение имеет тип String, вы не сможете получить размер, кроме синтаксического анализа значения с помощью обычного выражение или что-то в этом роде. В этом случае лучше рассмотреть рефакторинг.

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