Deque.java

Re: Deque.java

por José Coelho de Pina -
Número de respostas: 0

Oi Bruna,

Muito obrigado por compartilhar o problema.

Quando compilo ResizingArrayQueue.java obtenho as mensagem abaixo

% javac ResizingArrayQueue.java 
Note: ResizingArrayQueue.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
% javac -Xlint:unchecked ResizingArrayQueue.java 
ResizingArrayQueue.java:50: warning: [unchecked] unchecked cast
        q = (Item[]) new Object[2];
                     ^
  required: Item[]
  found:    Object[]
  where Item is a type-variable:
    Item extends Object declared in class ResizingArrayQueue
ResizingArrayQueue.java:75: warning: [unchecked] unchecked cast
        Item[] temp = (Item[]) new Object[capacity];
                               ^
  required: Item[]
  found:    Object[]
  where Item is a type-variable:
    Item extends Object declared in class ResizingArrayQueue
2 warnings

Esses warnings são incômodos. O compilador esta nos avisando que estamos fazendo algo estranho. Sobre esses avisos o SW dizem que é assim mesmo. Não é possível alocar um array de um tipo genérico. Isso podemos facilmente verificar:

% javac -Xlint:unchecked ResizingArrayQueue.java 
ResizingArrayQueue.java:51: error: generic array creation
        q = new Item[2];
            ^
ResizingArrayQueue.java:77: error: generic array creation
        Item[] temp = new Item[capacity];
                      ^
2 errors

A política adotada por SW foi criar um vetor de referências e depois usar o casting para o compilador não gritar muito. Compilador gritando muito:

ResizingArrayQueue.java:50: error: incompatible types: Object[] cannot be converted to Item[]
        q = new Object[2];
            ^
  where Item is a type-variable:
    Item extends Object declared in class ResizingArrayQueue
ResizingArrayQueue.java:75: error: incompatible types: Object[] cannot be converted to Item[]
        Item[] temp = new Object[capacity];
                      ^
  where Item is a type-variable:
    Item extends Object declared in class ResizingArrayQueue
2 errors

Com o casting o compilador passa de erros para avisos, como podemos verificar na primeira compilação acima.

Essa sugestão é proposta por outros. O sítio The finest artist, Effective Java 2/e, Item 26 apresenta uma (várias) sugestão (sugestões) interessantes.

A discussão sobre "arrays genéricos em Java" come solta no stackoverflow, por exemplo: [How to create a generic array in Java] (https://stackoverflow.com/questions/529085/how-to-create-a-generic-array-in-java).


Na internet há ainda várias sítios falando sobre Java não permitir arrays genéricos:



Ideias?
Sugestões?
Dicas?