Dúvida sobre java e polimorfismo

3 respostas
G

Eu tenho um método que ésobrecarregado várias vezes mudando sua assinatura. Tenho tambem uma lista de object. Como faço para saber qual metodo sera chamado? Segue exemplo do problema ...

import java.util.ArrayList;
import java.util.List;

public class Teste {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		List<Object> l = new ArrayList<Object>();
		l.add(new String("Puta que o pariu"));
		l.add(2);
		l.add(new Bla(){public String toString(){return "Caralho";}});

		for (Object object : l) {
			print(object);
		}
	}
	
	static class Bla {}

	public static void print(Object s) {
		print((String) s);
	}

	public static void print(String s) {
		System.out.println(s);
	}

	public static void print(Integer s) {
		System.out.println("Imprimindo um numero");
	}
	
	public static void print(Bla s) {
		System.out.println(s.toString());
	}
}

No exemplo, um erro sera gerado em runtime pq ele não conseguir converter Object para Integer, tendo em vista que ele sempre chama o método que usa o Object como parametro.

Resumindo ele não olha para a instância, ele sempre olha para a assinatura do método e para o tipo declarado da variável.

3 Respostas

Felagund

Nesse seu exemplo seria mais facil fazer assim

public static void print(Object s) {  
         print(s);  
    }

Ele vai imprimir tudo certo.

mas vc pode usar o instanceof para ver o tipo de instancia e fazer o cast correto.

[]'s

G

Esse exemplo, na verdade, é uma simplificação do problema real. No problema real são classes sem vínculo e que precisam de tratamentos diferentes para a persistencia. Alguma idéia?

G

E substituindo no código que eu passei a sua alternativa … eu ganho uma StackOverflowException … creio que por chamada infinita de método recursivo.

Criado 5 de março de 2009
Ultima resposta 5 de mar. de 2009
Respostas 3
Participantes 2