Знаешь что? У меня был один из тех дней, где, как бы вы ни старались, все заканчивается тем, что работает так, чтобы иметь что-то действительно работает правильно, я собираюсь исправить ваш код!
Я иногда вижу, что люди публикуют общие перезаписи странных вопросов здесь, и я всегда задавался вопросом why !? Теперь я знаю, что это должно компенсировать день, когда одна из ваших виртуальных машин попадает прямо вверх, без всякой причины, у вас есть ошибка, которая ускользает от воспроизведения до момента, когда вы отводите взгляд, и ваша собака забыла о его самообслуживании спонтанно.
В любом случае вам нужно выяснить, хотите ли вы, чтобы эту переменную вызывали dict
или view
. Выберите один, но вам нужно будет придерживаться его. Мне все равно, но я использую здесь dict
. Если вы предпочитаете другого, эй, это ваш код, делайте то, что вам нравится! Но не используйте оба, что будет запутывать.
Ваша проблема в том, что в вашей области вы используете только HashMap
. Используйте причудливые хорошо типизированные вещи или литые. В противном случае HashMap
просто держит Object
s. И Object
не является String[]
. Таким образом, вам нужно либо сделать результаты get()
, либо String[]
, либо просто забыть обо всем этом и использовать причудливые хорошо типизированные материалы (иногда мы называем это «generics»). Я собираюсь использовать причудливые хорошо типизированные вещи (HashMap<String, String[]>
), но, как я уже сказал, это ваш код, если вы хотите!
Во всяком случае, что заставляет нас:
public class problem
{
HashMap<String, String[]> dict;
public problem()
{
HashMap<String, String[]> dict = new HashMap<String, String[]>();
// put everything into hashmap
String[] items =
{
"toys", "sun"
};
dict.put("animal", items);
String[] items_2 =
{
"fun", "games"
};
dict.put("human", items_2);
this.dict = dict;
// start
this.BeginM();
}
public void BeginM()
{
System.out.println(this.dict.get("human")[0]); // should give "fun"
}
}
Смотрите мою линию 3? Объявив это поле dict
как HashMap<String, String[]>
, теперь BeginM()
знает, какие объекты он держит, и вы больше не получите эту ошибку.
Хотя я бы на шаг дальше и сделать его немного более кратким и немного меньше ошибок:
public class Problem
{
private final HashMap<String, String[]> dict;
public void Problem()
{
dict = new HashMap<String, String[]>();
dict.put("animal", new String[] { "toys, "sun" });
dict.put("human", new String[] { "fun", "games" });
BeginM();
}
public void BeginM()
{
System.out.println(dict.get("human")[0]);
}
}
Так что же я там делать? Ну, сначала я капитализировал Problem
.Это своего рода соглашение, чтобы иметь имена классов, начинающиеся с заглавной буквы. Не обязательно, конечно, но это хорошо, особенно если вы работаете с другими разработчиками. Пример: я думал, что ваш конструктор для problem
был методом, которому не хватало возвращаемого значения! Кроме того, я сделал dict
окончательным и частным, это значит, что вы не случайно перезапишите это поле позже. И я сделал это частным, что является хорошим дизайном. Если кому-то еще нужно это сделать, мы можем дать им метод доступа. Наконец, я избавился от this.
, потому что мне это не очень нравится - но, эй, еще ваш код, верните его, если хотите!
Это, гм, скомпилировать? –
Интересное совпадение - вы оставили строку кода, которая вызывает проблему. – Java42
Чак, он ничего не оставил. Однако правильно, что приведенное выше не будет компилироваться. – collinjsimpson