Passar vários tipos de objectos no mesmo método

7 respostas
sod

Boas pessoal.

Tenho uma método que recebe um objecto como parametro, gostava de saber como faço para passar um tipo de objecto diferente do declarado.

public boolean recebeObjecto (Object obj)
{
    obj.metodo ();
}

A a = new A();
B b = new B();

recebeObjecto (a);
recebeObjecto (b);

Obrigado

7 Respostas

F

nao tem como. tem que ser do mesmo tipo, mas se vc usar a classe Object que nem voce fez acima voce vai poder passar qualquer objecto ja que todos os objetos herdam da classe Object. depois é só fazer o cast para poder usar qualquer metodo do objeto.

tua pergunta nao ficou muito clara, o que vc ta querendo fazer ?

otaviojava

você também pode fazer um Map<String, Objetc> e na hora você retorna o objeto desejado a partir da chave.

adrianoms

vc pode resolver isso usando POO com herança ou interface

recomendo dar uma linda na apostila de java basico da caelum
http://www.caelum.com.br/apostilas/ - é a fj-11
em especifico no capitulo 7 Orientação a Objetos - herança, reescrita e polimorfismo

cesar.oliveira
Para passar vários tipos de objetos no mesmo método você pode utilizar a palavra reservada instanceof para verificar qual é o tipo do parâmetro que foi passado, veja abaixo:
//Você pode declarar um parâmetro como Object
			//E depois dentro do metodo verificar de que tipo ele é para depois tomar as devidas providências
			public void recebeObjeto(Object obj){
				
				//Você consegue testar o objeto através da palavra reservada instanceof
				//Assim você pode verificá-lo se ele é de um tipo Integer por exemplo
				if (obj instanceof Integer) {
					
					//Verificado que é um tipo Integer você pode querer fazer cálculos com o mesmo ou outras coisas
					//Para isso basta você converter o parâmetro 'obj' para uma variável do tipo Integer
					//Abaixo está sendo usado uma forma de conversão chamada de conversão explícita
					//Onde você coloca entre parênteses o tipo que você quer que sua váriavel se converta
					//Mas tome cuidado, para utilizar esse recurso você deve ter certeza que está convertendo
					//o parâmetro para o tipo correto
					//Atribua a conversão a uma variável e a utilize da maneira desejada
					
					Integer novaInteger = (Integer) obj;
					novaInteger += 10;
					System.out.println("O objeto recebido como parâmetro é uma instancia da classe Integer");
				} else if (obj instanceof String) {
					
					//Mesma verificação
					
					String novaString = (String) obj;
					novaString = "O objeto recebido como parâmetro é uma instancia da classe String";
					System.out.println(novaString);					
				} else if (obj instanceof Pessoa) {
					
					//Nesse exemplo verificou-se que era uma instacia da classe Pessoa
					//Converteu o parâmetro 'obj' para uma variável do tipo pessoa
					//E só assim se consegue utilizar os metodos específicos da classe pessoa
					
					Pessoa novaPessoa = (Pessoa) obj;
					
					//Só depois de converter, que se consegue utilizar os métodos da classe Pessoa 
					
					novaPessoa.setNome("Cesar Oliveira");
					System.out.println("Objeto recebido como parâmetro é uma instancia da classe Pessoa");
				}
			}

Att :D.

cesar.oliveira

Outro recurso interessante do Java Varargs.
Imagine que você tem que criar um método que calcule a média dos números passados como parâmetro.
De início, você cria um método que recebe 2 parâmetros.
Depois você vê a necessidade de se criar o mesmo método mas passando agora 4 parâmetros.
Depois ainda você sente a necessidade de criar o mesmo método só que agora passando 7 parâmetros.
Para resolver isso você poderia usar o recurso de sobrecarga e sempre mantendo os métodos com o mesmo nome, porém com lista de parâmetros diferentes.

Agora se tivesse que criar um método, que em determinado momento você recebesse 3 parâmetros, em outro momento recebesse 4, em outro 5, em outro 20, e assim por diante, seria inviável ficar criando vários métodos para resolver esse problema.

Para criar um método que recebesse um número indefinido de parâmetros você possui hoje o recurso de Varargs, que nada mais é do que "dizer" pro Java que um determinada parâmetro de seu método poderá receber 1 parâmetro, 2 parâmetros ou 200.
Veja a sintaxe para a declaração desse método:

public tipoDeRetorno nomeDoMetodo(TipoDeParametro... nomeDoParametro){
Ao usar reticências depois do tipo de parâmetro você tem que dar um nome para esse parâmetro. Dessa maneira para esse parâmetro você pode passar vários valores. E dentro do método você irá trabalhar com esse parâmetro como se fosse um array. Veja agora um exemplo:
//Declaração do método
			public static Double calculaMedias(Double... numeros){
				
				//O parâmetro 'numeros' tem que ser tratado como um 'array'
				
				Integer tamanhoDoArray = numeros.length; //pega o tamanho do array
				Double soma = 0.0;  //variável que irá somar todas as ocorrências de números dentro do 'array'
				Double media = 0.0;	//variável de retorno
				
				if (tamanhoDoArray > 0){ //se o 'array' possuir mais do que 0 números, significa que ele não está vazio
					
					for (int i = 0; i < tamanhoDoArray; i++){ // percorre o array pegando todos os seus números e somando
						soma += numeros[i];
					}
					
					media = soma / tamanhoDoArray;  // no final, ainda dentro do if, calcula a média
				}
				
				return media;  // retorna a média
			}
	
			//método main
			public static void main(String[] args) {
					//declaração de alguns números com valores diferentes
					Double n1 = 10.0;
					Double n2 = 20.0;
					Double n3 = 30.0;
					Double n4 = 40.0;
					Double n5 = 50.0;
					Double n6 = 60.0;
					Double n7 = 70.0;
					Double n8 = 80.0;
					Double n9 = 90.0;
					Double n10 = 100.0;
					
					//dentro do método 'System.out.println();' é chamado o método 'calculaMedias();' passando os parâmetros
					//o calculo é retornado e impresso
					
					//Veja que nesse primeiro momento são passados 2 valores
					System.out.println(calculaMedias(n1,n2));
					System.out.println(calculaMedias(n1,n2,n3,n4));  	//Agora são passados 4 valores
					System.out.println(calculaMedias(n1,n2,n3,n4,n5,n6));	//Agora são passados 6 valores
					System.out.println(calculaMedias(n1,n2,n3,n4,n5,n6,n7,n8,n9,n10));	//Agora são passados 10 valores
					System.out.println(calculaMedias(n3,n6,n10,n1,n5));		//Agora são passados 5 valores
					System.out.println(calculaMedias());	//Agora são passados 0 valores
					// repare que nessa última chada não são passados valores para o 
					//método e assim ele não irá entrar no 'if' pois o '.length' é 0
			}

O resultado da execução disso seria:
15.0
25.0
35.0
55.0
50.0
0.0

O método que acabei de mostrar só tem 1 parâmetro, porém ele pode possui um número indefinido de valores.

Esse seu método pode ter mais de um parâmetro veja a sintaxe:

public tipoDeRetorno nomeDoMetodo(Tipo parametro1, Tipo, parametro2, TipoDeParametro... nomeDoParametro){

Com isso você pode passar passar por exemplo 2 Srtings, e depois uma várias Strings para o último parâmetro.

Observação 1: É extremamente importante que o parâmetro que irá receber vários valores (vararg) sempre fique por último na declaração do método, senão não irá compilar.

Observação 2: Só pode haver um vararg por método.

Ou seja, sempre delare o vararg no final do métodos, veja abaixo exemplos Certos e Corretos de declaração:

Maneiras CORRETAS de delcaração de métodos com varargs

public void metodoA(int a, int b, int c, Double... variavel){}
			public void metodoB(String a, int... variavel){}
			public void metodoC(String a, int b, Double c, String... variavel){}
			public void metodoD(Double a, Integer... variavel){}
			
			//Veja abaixo, o varargs pode ser de qualquer tipo de classe
			public void metodoE(Double a, int b, Pessoa... variavel){}
			public void metodoF(Double a, char b, int c, String d, Notas... variavel){}
			public void metodoG(Double a, Animal... variavel){}
			public void metodoH(Double a, Integer b, FigurasGeometricas... variavel){}
			//Ou até mesmo Object
			public void metodoI(char a, String b, Object... variavel){}
			
			//Ou como já vimos, somente possuindo o 'vararg'
			public void metodoI(Object... variavel){}
Maneiras [u]IN
[color=red] [/color]CORRETAS de delcaração de métodos com varargs
//Nenhum dos casos abaixo são compilados
			//Errado pois posssui 2 varargs
			public void metodoA(Double... variavel, Double... variavel2){}
			//Errado pois posssui começa a lista de parâmetros com varargs
			public void metodoB(Double... variavel, int x){}
			//Errado pois o varargs está no meio do método
			public void metodoC(String a, String... variavel, Double c){}
			
			//Leis simples para vaarargs:
				// 1: Só pode existir 1 e apenas 1 vararg por metodo
				// 2: O vararg deve ser obrigatóriamente o último parâmetro a ser delarado
				// 3: Além do vararg, pode existir ou não outros parâmetros no método, desde que respeitem as leis 1 e 2

É isso ai gente qualquer dúvida ou erro que eu tenha cometido postem ai. Abraço a todos. :D Att.

adrianoms

cesar.oliveira:
Outro recurso interessante do Java Varargs

sempre quis saber com fazer isso mas nunca tinha ido atraz, valeu cara. :slight_smile:

sod

Estou a tentar fazer isto, vê o último post.

http://www.guj.com.br/java/243129-lista-ligada-armazenando-um-objecto-usando-cast

Obrigado pelas dicas até agora, tenho aprendido bastante.

Criado 29 de maio de 2011
Ultima resposta 29 de mai. de 2011
Respostas 7
Participantes 5