Jump to content

Recommended Posts

Posted (edited)

Boas!

Eu tenho a seguinte duvida, por exemplo temos este codigo

List<Object> obj= new ArrayList<Object>();
 obj.add(new Integer(2));
 obj.add(new Food("Peixe"));
obj.add(new String("teste"));
System.out.println(obj.toString());

isto não da erro. Tenho uma lista de objectos que contem um Integer e uma Food e uma String, a minha duvida vem agora, se eu fizer isto da me erro porque?

static void teste(List<Object> obj){
 System.out.println(obj.toString());
}

List<String> string= new ArrayList<String>();
string.add(new String("s"));
TesteJava.teste(string);

Apesar de eu estar a pedir inicialmente no método teste, uma List de object e depois passar uma list de String devia ser possível executar o código pois de eu em no 1 exemplo consigo adicionar Strings.

Edited by AJBM
Posted

O problema está no protótipo da função. Enquanto no primeiro código não tens função nenhuma e a linguagem trata tudo por ti, no segundo código, estás a chamar uma função passando um argumento que não é do mesmo tipo.

nota : se dá erro deverias apresentar o erro que te é dado pelo compilador.

IRC : sim, é algo que ainda existe >> #p@p
Posted

Mas a classe object esta no topo da hierarquia, logo todos as outras classes herdam de object logo são object certo, logo devia dar, o erro e actual argumento List<String> nao pode ser convertido List<Object>

Posted (edited)

Não existe covariância de tipos parametrizados. Enquanto que uma String é um Object, uma List<String> não é uma List<Object>. No entanto, uma List<String> já é uma List<? extends Object>. Daí os wildcards.

Edit: uma resposta minha na Zwame:

Isso acontece porque em Java não há covariância de tipos parametrizados. Quer isto dizer que, enquanto que podes atribuir a uma variável de um determinado tipo um objecto cujo tipo é do mesmo tipo ou sub-tipo, isto é, podes atribuir um tipo dinâmico à variável que seja do mesmo tipo ou sub-tipo do seu tipo estático (situação equivalente para os arrays), tal não pode ser feito com tipos parametrizados, como sejam todas as classes da Java Collections Framework. Exemplificando:

Podes fazer isto:

Prato p = new PratoVegetariano();

Prato[] array = new PratoVegetariano[10];

p tem tipo estático Prato e tipo dinâmico PratoVegetariano. Os métodos que p pode invocar são determinados pela combinação do dynamic binding (atribuição de tipos dinâmicos a variáveis cujo tipo estático é do mesmo tipo ou super tipo desse tipo, e posterior determinação de quais os métodos que pode invocar) e do algoritmo de dynamic method lookup, que permite a procura ascendente na hierarquia de classes em questão pelo método invocado, começando na classe correspondente ao tipo dinâmico.

Situação idêntica para os arrays.

Não podes fazer:

List<Prato> l = new ArrayList<PratoVegetariano>();

List<Prato> é um tipo parametrizado. O parâmetro é, também ele, um tipo: Prato. Em Java, não há covariância de tipos parametrizados, quer isto dizer que não podes atribuir, neste caso, a uma lista de Prato uma lista de PratoVegetariano, mesmo verificando-se que PratoVegetariano é subclasse de Prato na hierarquia de classes.

Para resolver este problema tens de usar aquilo a que se chama de wildcards. Esta construção permite-te dizer que a um determinado tipo cujo parâmetro é de um dado tipo ou seu sub-tipo qualquer, podes atribuir um tipo do mesmo tipo ou sub-tipo. Assim, temos:

List<? extends Prato> l = new ArrayList<PratoVegetariano>();

Aquela construção que vês em List, indica que podes atribuir à variável 'l' um objecto, neste caso uma colecção, que comporte objectos do mesmo tipo (Prato) ou de algum sub-tipo de Prato que não importa especificar, é um qualquer que possa vir a ser criado (neste caso: PratoVegetariano).

http://forum.zwame.pt/archive/index.php/t-499862.html

Edited by Baderous

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.