Ну, во-первых, вы теряете память с помощью нового HashMap
вызова создания. Ваша вторая строка полностью игнорирует ссылку на этот созданный хэш, что делает ее доступной сборщику мусора. Итак, не делайте этого, используйте:
private Map & lt; String, String & gt; someMap = (HashMap & lt; String, String & gt;) getApplicationContext (). getBean ("someMap");
Во-вторых, компилятор жалуется, что вы передали объект в HashMap
, не проверяя, является ли это HashMap
. Но даже если вы должны были сделать:
if (getApplicationContext (). GetBean ("someMap") instanceof HashMap) {private Map & lt; String, String & gt; someMap = (HashMap & lt; String, String & gt;) getApplicationContext (). getBean ("someMap"); }
Возможно, вы все равно получите это предупреждение. Проблема в том, что getBean
возвращает Object
, поэтому неизвестно, что это за тип. Преобразование его в HashMap
напрямую не вызовет проблемы со вторым случаем (и, возможно, в первом случае не было бы предупреждения, я не уверен, как педантичный компилятор Java с предупреждениями для Java 5). Тем не менее, вы преобразовываете его в HashMap & lt; String, String & gt;
.
HashMaps - это действительно карты, которые берут объект в качестве ключа и имеют объект как значение, HashMap & lt; Object, Object & gt;
, если хотите. Таким образом, нет никакой гарантии, что когда вы получите свой bean-компонент, он может быть представлен как HashMap & lt; String, String & gt;
, потому что вы могли бы иметь HashMap & lt; Date, Calendar & gt;
, потому что возвращаемое не общее представление может иметь любые объекты.
Если код компилируется, и вы можете выполнить String value = map.get («thisString»);
без каких-либо ошибки, не беспокойтесь об этом предупреждении. Но если карта не полностью содержит строковые ключи для строковых значений, во время выполнения вы получите ClassCastException
, потому что генерики не могут заблокировать это в этом случае.
Проблема заключается в том, что ваш обратный вызов вызывается, когда цикл завершен, поэтому value
изменился.
Решение состоит в том, чтобы использовать закрытие для хранения значения value
:
for (var value in CourseTitleArray) {
(function(value){
console.log( "Course Title " + CourseTitleArray[value]);
var newImageLocation = path.join(__dirname, 'app/img/courseImages', CourseTitleArray[value] + ".png");
fs.readFile(image.path, function(err, data) {
fs.writeFile(newImageLocation, data, function(err) {
console.log(CourseTitleArray[value] + " was created successfully");
});
});
console.log("Loop executed " + value);
})(value);
}
Обратите внимание, что непонятно, что вы имеете в виду с вашим журналом «Выполненный цикл»: когда вы регистрируетесь, запись еще не произошла.