Стек, возвращающий объекты вместо целых - PullRequest
0 голосов
/ 27 сентября 2011

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

import java.util.*;

public class Blocks
{
    public static void main(String[] args)
    {
        System.out.println();
        Scanner input = new Scanner(System.in);

        Stack[] blocks = new Stack[input.nextInt()];
        for (int i = 0; i < blocks.length; i++) {blocks[i] = new Stack<Integer>();} //initializing main array of stacks of blocks
        for (int i = 0; i < blocks.length; i++) {blocks[i].push(i);} //add first block to each stack
        Stack retainer = new Stack<Integer>(); //used for when moving stacks of blocks instead of one block.

        boolean m; //move or pile
        boolean on; //onto or over

        int fromBlock; //block being moved
        int toBlock; //block where the fromBlock is being moved

        String command = input.next();
        while (!command.equals("quit"))
        {
            m = command.equals("move");
            fromBlock = input.nextInt();
            on = input.next().equals("onto");
            toBlock = input.nextInt();

            if (m) //put back blocks on fromBlock
            {
                if (on) //put back blocks on toBlock
                {
                    int holder = blocks[fromBlock].pop().intValue(); //I get a compiler error here
                    moveOnto(blocks, holder, toBlock);
                }
                else //fromBlock goes on top of stack on toBlock
                {
                }
            }
            else //bring blocks on fromBlock
            {
                if (on) //put back blocks on toBlock
                {
                }
                else //fromBlock goes on top of stack on toBlock
                {
                }
            }

            command = input.next();
        }
    }

    void moveOnto(Stack[] array, int sBlock, int rBlock)
    {

    }
}

Ошибка говорит, что не распознает .intValue (). Очевидно, что это метод Integer, и с этого момента я обнаружил, что он возвращает объекты Object вместо типов Integer. Как я могу заставить его возвращать целочисленные типы?

Ответы [ 5 ]

3 голосов
/ 27 сентября 2011

Чтобы определить массив generic, вам нужно это сделать.

@SuppressWarnings("unchecked") // to avoid warnings.
Stack<Integer>[] blocks = new Stack[n];

Затем вы можете написать

int holder = blocks[fromBlock].pop();

И да, он компилируется и работает просто отлично.

РЕДАКТИРОВАТЬ: Почему компилятор не может позволить вам сделать

Stack<Integer>[] blocks = new Stack<Integer>[n];

или

Stack<Integer>[] blocks = new Stack<>[n];

, чтобы означать, что то же самое за мной.

1 голос
/ 27 сентября 2011
int holder = blocks[fromBlock].pop().intValue(); //I get a compiler error here

Измените это на:

int holder = ((Stack<Integer>blocks[fromBlock]).pop().intValue();

Вы получите предупреждение компилятора.

Вопреки всем неправильным ответам, вы не можете иметь массив универсальныхвведите в Java.

0 голосов
/ 27 сентября 2011

Вам необходимо изменить тип блоков на Stack<Integer>[].

edit: Код хорошо компилируется.Вы получаете предупреждение, которое напоминает вам о том, что неправильное присвоение массива все еще может произойти во время выполнения, поэтому компилятор не может гарантировать, что вы не получите ClassCastException во время выполнения, если вы напишите некорректный код.Однако опубликованное решение делает именно то, чего хочет ОП:

public static void main(String[] args) throws Exception {
    Stack<Integer>[] array = new Stack[] { new Stack(7) };
    Integer result = array[0].pop();
}

class Stack<T> {

    private final T foo;

    public Stack(T foo) {
        this.foo = foo;
    }

    T pop() {
        return foo;
    }
}

пс.Чтобы уточнить, это предупреждение указывает на то, что даже если вы не выполняете явное приведение, вы все равно можете получить ClassCastException во время выполнения, как показано в следующем коде:

    public static void main(String[] args) throws Exception {
        Stack<Integer>[] array = new Stack[] { new Stack(7) };

        Stack notAnIntegerStack = new Stack<Object>(new Object());
        array[0] = notAnIntegerStack;

        Integer result = array[0].pop(); // class cast exception at runtime
    }

По всему этому есть предупреждениякод указывает на опасность, но он скомпилируется.Надеюсь, это прояснит ситуацию.

0 голосов
/ 27 сентября 2011

(упс - Java не допускает массивы обобщений) Измените объявление переменной Stack для использования универсальной версии Stack:

Stack<Integer>[] blocks = new Stack<Integer>[input.nextInt()];

В противном случае, когда вы обращаетесь к методу .pop() неуниверсального стека, он просто возвращает объект, который вам нужно будет преобразовать обратно в целое число , чтобы получить доступ к методам целого числа, например intValue ():

int holder = ((Integer)blocks[fromBlock].pop()).intValue();

(Но вам не нужно будет кастовать, если вы исправите объявления.)

0 голосов
/ 27 сентября 2011

Используйте Stack Generic версию Stack

т.е.

Stack<Integer>[] blocks = new Stack<Integer>[input.nextInt()];

Вы должны включить универсальный параметр в объявленный тип

т.е.

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