HashMap ClassCastException String в MyClass

Я хочу перебрать HashMap.

public void setMyHashMap(final String key,
        final HashMap<Integer, MyClass> value) throws NullPointerException{
        settings.put(key, value);
}

public HashMap<Integer, MyClass> getMyHashMap(String key) {
    return (HashMap<Integer, MyClass>) settings.get(key);
}
------------------------------------------------------------
for (Map.Entry<Integer, MyClass> e : settings.getMyHashMap(key)
                                             .entrySet()) {
    System.out.println(e.getValue());
}

Это отображает ссылку на объект MyClass, например «MyClass @ 9d5f8e».

for (Map.Entry<Integer, MyClass> e : settings.getMyHashMap()
                                             .entrySet()) {
    System.out.println(e.getValue().getLabel());
}

Но как только я хочу получить доступ к данным этого объекта, он передается в MyClass, что должно быть в порядке, но это не так. Кажется, что объект на самом деле является строкой, когда я получаю это исключение:

java.lang.ClassCastException: java.lang.String не может быть преобразован в MyClass

Я не понимаю. Я передаю HashMap несколько раз, и SettingsClass без проблем передает сохраненный объект в HashMap. Если я печатаю значение, я получаю ссылку на MyClass, но как только я хочу получить доступ к данным в нем, JRE считает, что это объект String.


person Don    schedule 22.07.2015    source источник
comment
показать больше о вашем коде   -  person codeaholicguy    schedule 22.07.2015
comment
Ваша settings карта, вероятно, имеет значения карт типа HashMap<Integer, String>.   -  person Codebender    schedule 22.07.2015
comment
System.out.println (e.getValue (). GetClass ()); не работает, так как он хочет сначала выполнить приведение к MyClass, и возникают те же исключения. Если бы на моей карте была строка, которая действительно не может быть, поскольку существует только один метод для хранения MyClass в ней, не будет ли она просто генерировать исключение в этот момент, чего нет.   -  person Don    schedule 22.07.2015
comment
пожалуйста, опубликуйте ту часть, где вы put значения в HashMap   -  person geert3    schedule 22.07.2015
comment
какой тип кода ты хочешь? есть только мои setSettings, которые могут быть важны   -  person Don    schedule 22.07.2015
comment
Проблема может быть в вашем MyClass, а не в карте, покажите для нее код   -  person Tuxxy_Thang    schedule 22.07.2015
comment
MyClass очень прост, 3 частные переменные с простыми методами get и set, не более того.   -  person Don    schedule 22.07.2015
comment
В вызове метода getMyHashMap () вы не используете строковый параметр, который вам следует. Можете ли вы сохранить 'e' в переменной и проверить, какой тип переменной вы действительно получаете при итерации по entrySet ()?   -  person milez    schedule 22.07.2015
comment
Опечатка. Я не знаю, правильно ли я понял вашу идею, милез, но сохранение e в переменной не работает, потому что оно передается, что не работает ...   -  person Don    schedule 22.07.2015
comment
Сохраните его в Object, все в java наследуется от Object (также возможно, на самом деле очень вероятно, что я просто не понимаю)   -  person milez    schedule 22.07.2015
comment
Я могу хранить e в Object, обратное приведение тоже работает. Но опять же, если я хочу получить доступ к данным, я получаю исключение. Я так сбит с толку, почему это не работает.   -  person Don    schedule 22.07.2015
comment
Кажется, что библиотека настроек jira поддерживает только строки в своих списках и картах ... Как вы могли это знать, я чувствую себя глупо.   -  person Don    schedule 22.07.2015
comment
Что конкретно такое настройки? Если это bean-компонент в самой JIRA или в SAL, который вы пытаетесь использовать для сохранения объекта, помните, что жизненный цикл вашего плагина (и, следовательно, жизненный цикл ваших классов) не зависит от любого хранилища, которое использует JIRA. Например, вы можете сохранить объект, а затем удалить свой плагин. MyClass отключается, но объект все еще сохраняется. Результатом этого является то, что вы обычно ограничены использованием классов JRE и собственных классов JIRA для всего, что вы просите JIRA сохранить. (Если вам нужно хранить свои собственные объекты, сначала сериализуйте их в XML.)   -  person Scott Dudley    schedule 22.07.2015
comment
Я использую настройки плагина SAL. Спасибо, Скотт, за объяснение, почему я не могу сохранить MyClass в этих настройках. Если бы я думал об этом, возможно, я узнал бы об этом сам ... Думаю, я сделаю JSON-Strings для хранения моего объекта в настройках.   -  person Don    schedule 23.07.2015


Ответы (1)


Ваш код должен работать - я только что попробовал:

class MyClass {
    public String foo;
    public String bar;

    public String getLabel() {
        return "foo: " + foo + ", bar: " + bar;
    }
}

MyClass myObj1 = new MyClass();
myObj1.foo = "foo1";
myObj1.bar = "bar1";

MyClass myObj2 = new MyClass();
myObj2.foo = "foo2";
myObj2.bar = "bar2";

java.util.Map<Integer, MyClass> myHashMap = new java.util.HashMap<Integer, MyClass>();
myHashMap.put(1, myObj1);
myHashMap.put(2, myObj2);

for (java.util.Map.Entry<Integer, MyClass> e : myHashMap.entrySet()) {
    System.out.println(e.getValue().getLabel());
}

Это произвело результат (как и ожидалось):

foo: foo1, bar: bar1
foo: foo2, bar: bar2
person nutfox    schedule 22.07.2015
comment
Это ДОЛЖНО работать, я так думаю, но, видимо, это не так. - person Don; 22.07.2015
comment
Можете ли вы отладить код и посмотреть, что на самом деле отображается на карте во время выполнения? - person nutfox; 23.07.2015