AJBM Posted October 3, 2012 at 03:02 PM Report #477593 Posted October 3, 2012 at 03:02 PM (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 October 3, 2012 at 03:03 PM by AJBM
HappyHippyHippo Posted October 3, 2012 at 03:25 PM Report #477597 Posted October 3, 2012 at 03:25 PM 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 Portugol Plus
AJBM Posted October 3, 2012 at 03:48 PM Author Report #477600 Posted October 3, 2012 at 03:48 PM 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>
Baderous Posted October 3, 2012 at 04:07 PM Report #477601 Posted October 3, 2012 at 04:07 PM (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 October 3, 2012 at 04:09 PM by Baderous
AJBM Posted October 3, 2012 at 05:24 PM Author Report #477610 Posted October 3, 2012 at 05:24 PM ok ja percebi obrigado 👍
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now