Как получить доступ к переменной из основного, Java - PullRequest
0 голосов
/ 23 марта 2012

У меня возникают проблемы при попытке сделать HashMap доступным для других методов в классе, в котором он находится.

Вот в основном то, что я пытаюсь сделать,

class object
    method main
        this.test=9
    method fire
        output this.test

Вотреальный код

import java.util.*;
import java.lang.String;
import java.util.HashMap;

public class problem {
    public HashMap 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" };
        view.put("human", items_2);

        this.view = view;

        // start
        this.BeginM();
    }

    public void BeginM() {
        System.out.println(this.view.get("human")[0]); // should give "fun"
    }
}

Я получаю эту ошибку на этапе вывода:

array required, but java.lang.Object found

Ответы [ 3 ]

5 голосов
/ 23 марта 2012

Знаешь что? У меня был один из тех дней, когда, как ни старайся, ничто не заканчивалось тем, что работало правильно, поэтому, чтобы что-то действительно работало правильно, я исправлю твой код!

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

В любом случае вам нужно выяснить, хотите ли вы, чтобы эта переменная называлась dict или view. Выберите один, но вам нужно придерживаться его. Мне все равно, но я использую dict здесь. Если вы предпочитаете другой, эй, это ваш код, делайте что хотите! Но не используйте оба, это может запутать.

Ваша проблема в том, что в вашей области вы просто используете HashMap. Используйте модные, хорошо напечатанные вещи или актерский состав. В противном случае HashMap просто содержит Object с. И Object не String[]. Так что вам нужно либо привести результаты get() к String[], либо вы можете просто забыть обо всем этом и использовать причудливые, хорошо напечатанные вещи (иногда мы называем это «дженерики»). Я собираюсь использовать причудливые хорошо напечатанные вещи (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 final и private, чтобы вы случайно не перезаписали это поле позже. И я сделал это частным, что является хорошим дизайном. Если кому-то еще нужно это сделать, мы можем дать ему метод доступа. Наконец, я избавился от this., потому что он мне не очень нравится - но, эй, по-прежнему ваш код, отложите его, если хотите!

0 голосов
/ 23 марта 2012

Изменение: (Кстати, отсутствует в вашем примере)

Map view = new HashMap<String,String[])

до *; 1004 *

Map<String,String[]> view = new HashMap<String,String[])
0 голосов
/ 23 марта 2012

Я думаю, this.view.get("human") возвращает строку, а не массив.Вам нужно использовать this.view.get("human").charAt(0) вместо this.view.get("human")[0], поскольку строки Java нельзя индексировать как массивы.

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