Método Genérico

3 respostas
V

Olá pessoas, estou com duas dúvidas, a primeira é rápida:

  1. Ainda cai Serialização na OCJP 6?

A segunda é um exercício do livro da Kathy, para ser mais específico o exercício 8 do capítulo 7, segue:

Dado um método declarado como:

public static <E extends Number> List<? super E> process(List<E> nums)

Um programador deseja usar esse método da seguinte forma:

// INSIRA AS DECLARAÇÕES AQUI

output = process(input);

Quais pares de declarações poderiam ser colocados em // INSIRA AS DECLARAÇÕES AQUI para permitir a compilação do código?

B.

ArrayList<Integer> input = null;
List<Integer> output = null;

Segundo o livro a opção B está correta, mais quando compilei esse código recebo o seguinte erro:

Test.java:10: incompatible types

found   : java.util.List<capture#469 of ? super java.lang.Integer>

required: java.util.ArrayList<java.lang.Integer>

output = process(input);

^

1 error

E mais uma coisa, no livro diz que o tipo de retorno é declarado como um List e portanto a linha:

List<Integer> output = null; // Não pode ser ArrayList<Integer> output = null;

Mas no tipo base o polimorfismo não devia se aplicar?

Enfim é só(tudo) isso, faço minha prova próxima quarta me desejem sorte!

3 Respostas

Andersonrms

1 - Eu acho q cai serialização sim, mas não tenho certeza.

Não tem como eu testar o código aqui agora, mas o livro parece estar certo. Pelo que eu entendi o método retorna uma List de Number ou de alguma de suas sub ou super classes. E tem como parâmetro uma List de Number ou de alguma subclasse de Number. E pelo que você colocou a letra b satisfaz isso.

E a variável que recebe o retorno não pode ser ArrayList pq o método retorna uma List e nem toda List é um ArrayList. Pra isso vc deveria fazer o downcasting:

ArrayList output = (ArrayList) process(input);
V

Entendi, quanto ao tipo de retorno e para mim faz sentido também a resposta do livro, só não consigo entender pq o código não compila.

V

Tanto tempo estudando em editor de texto que me esqueci do eclipse.

Pelo oq eu entendi o código não compila pq a variável List<Integer> output pode receber uma List Number, então para o código compilar ela deve ser alterada para List<? super Integer> output ou fazer um cast na linha output = process(input); para output = (List<Integer>) process(input);

Parece que nem a Kathy passaria com 100% na prova!

Criado 10 de outubro de 2012
Ultima resposta 11 de out. de 2012
Respostas 3
Participantes 2