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:
- What's the reason I can't create generic array types in Java?
- Why does Java prohibit generic array creation?
- Why is Generic Array Creation not Allowed in Java?. Este é legal. Tem que fixar pensando.
- Restrictions on Generics. Aqui temos a palavra oficial.
Ideias?
Sugestões?
Dicas?