2012-03-22 2 views
-1

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

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

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 
+0

Это, гм, скомпилировать? –

+0

Интересное совпадение - вы оставили строку кода, которая вызывает проблему. – Java42

+0

Чак, он ничего не оставил. Однако правильно, что приведенное выше не будет компилироваться. – collinjsimpson

ответ

5

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

Я иногда вижу, что люди публикуют общие перезаписи странных вопросов здесь, и я всегда задавался вопросом 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., потому что мне это не очень нравится - но, эй, еще ваш код, верните его, если хотите!

+0

+1, так как у вас был трудный день, и это достойный ответ на плохо сформированный вопрос. –

+0

wow, awesome, я рад, что получил хорошо объясненный ответ, спасибо! – user1277330

+0

@ user1277330: добро пожаловать в stackoverflow! –

0

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

+0

Я не думаю, что 'this.view.get (" human ")' мог бы вернуть что-либо, так как 'this.view' не определен нигде. Но я думаю, что намерение (хотя, я признаю, трудно сказать) состоит в том, чтобы иметь HashMap ', что означает, что да,' view.get ("human") 'будет возвращать массив. –

+0

'view' подразумевается как HashMap из-за того, как он обращается к нему. 'get()' определяется в классе Map. – collinjsimpson

+0

Я не думаю, что компилятор будет спонтанно создавать переменную из-за импликации. И если это так, то мне нужно начать использовать этот. –

0

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

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

к;

Map<String,String[]> view = new HashMap<String,String[]) 
+1

Вы пытались скомпилировать код, который он опубликовал? –

+0

Да, и я знаю, что он не компилируется, и я знаю, что конкретная ошибка возникает из-за отсутствия генериков в var типа Map. Этот парень просто пытается научиться Java, и ему нужно немного ориентироваться. – Java42

+1

Отсутствие типов на карте просто вызовет некоторые предупреждения в коде, а не ошибки. Его проблема связана с именем переменных и функцией «main», которую он не опубликовал. –

Смежные вопросы