Série da semana: Buscas semânticas com Elasticsearch

Veja mais

Polimorfismo - Java

24/10/2018

Criar uma classe principal com o método main. ¢  Criar um outro método estático em principal com a seguinte assinatura: —  public static Airplane [] retornaAleatorio() ¢  Esse método deve criar um array com o tamanho sendo calculado por Math.random de 0 a 100. Esse método deve ser preenchido com instâncias de Helicopter e Seaplane. Cada posição do array deverá conter um Helicopter ou Seaplane. Para saber qual instância será criada, crie um terceiro método estático chamado alea() que deverá retornar aleatoriamente um número. Utilize esse método para preencher o array. Se o retorno do metodo ale() for impar, crie um Helicopter, se for par, um Seaplane.

Pois eu estou com um pequeno problema na minha funcao fazerDecolar(), onde eu faco a verificacao se for Aviao ou Helicoptero, eu chamo o metodo de acordo com o tipo do objeto, usando o instanceof e depois fazendo o casting para minha classe mais especifica.

[code=java][/import java.util.*;

public class Principal {

public static int gerarNumeroAleatorio() {
Random gerador = new Random();
int num = gerador.nextInt(100);
return num;
}
public static int gerarTamanhoArray() {
Random gerador = new Random();
int index = gerador.nextInt(100);
return index;
}

public static Voador[] criaArray(Voador array[]) {
int index = Principal.gerarTamanhoArray();
for(int i=0;i<index;i++) {
int aux = new Principal().gerarNumeroAleatorio();// chamada da função que gerara numero aleatorio para decidir se sera criado objeto Aviao ou Helicoptero
if(aux%2==0) {
array[i] = new Aviao();
}else if(aux%2!=0) {
array[i] = new Helicoptero();
}
}
return array;
}
public static Voador[] fazerDecolar(Voador array[]) {
new Principal().criaArray(array);
for(int i=0;i<array.length;i++) {
if(array[i] instanceof Aviao) {
Aviao a = (Aviao)array[i].ligarTurbina(); -> erro aqui, compilador diz q ligarTurbina esta indefinido pra Voador
}else if(array[i] instanceof Helicoptero) {
Helicoptero h = (Helicoptero)array[i].ligarHelice(); -> msm erro de cima so q pra funcao ligarHelice
}
}
return array;

}


public static void main(String[] args) {

int index = Principal.gerarTamanhoArray();
Voador [] a1 = new Aeronave[index];
Principal.criaArray(a1);
Principal.fazerDecolar(a1);

}

}
]

Lembrando que eu tenho a classe abstract Aeronave, a interface Voador, e as minhas duas classe concretas Helicoptero e Aviao, sendo q estas duas herdam Aeronave e implementam Voador respectivamente.

Melhor post

08/11/2018

Wendel, no método que você indicou o erro ele acontece pelo seguintes motivos:
- Primeiro seus métodos ligarTurbina() e ligarHelice() são void, então você nunca vai conseguir retornar um objeto Aviao ou Helicoptero para as variáveis 'a' e 'h'.
- Seu array é do tipo Voador e Voador não tem os métodos ligarTurbina() e ligarHelice(), embora eles também não retornem nada.
- Mesmo fazendo o cast com Aviao e Helicoptero, o retorno do cast vale para a variável de atribuição e não para o objeto array. Os métodos ligarXxx() existem só depois que o cast tiver sido retornado e não antes.

Então você tem duas formas de resolver, a primeira é essa:
    
/Aviao a = (Aviao)array[i].ligarTurbina();//trecho onde eh ocorre o erro

Aviao a = (Aviao)array[i];
a.ligarTurbina();

Veja que primeiro fazemos o cast e o objeto Aviao é retornado a variável 'a'. Só depois a gente acessa o método ligarTurbina().

A segunda forma é mais direta, parecida com a que você estava usando:
    
/Aviao a = (Aviao)array[i].ligarTurbina();//trecho onde eh ocorre o erro

((Aviao) array[i]).ligarTurbina();

Note a diferença. Ela está nos parenteses. Primeiro temos o cast que vai retornar um objeto Aviao: (Aviao) array[i]
Depois colocamos esse retorno, ou seja, a própria declaração entre um par de parenteses: ( (Aviao) array[i] )
Agora sim tem um objeto Aviao e podemos acessar seu métodos: ( (Aviao) array[i] ).ligarTurbina();
Responder Citar

Outros Posts

08/11/2018

Ballem

Seria necessário você postar o conteúdo da interface e das classes, senão não tenho como saber da onde vem os métodos. Use marcação de código fonte que tem no editor, selecione o código e pressione o primeiro botão a direita no topo do formulário.
Responder Citar

08/11/2018

Wendel Rios

Interface Voador

package faculdade.poo.arrays;

public interface Voador {
	
	public abstract void voar();
}


Classe Aeronave

package faculdade.poo.arrays;

public abstract class Aeronave implements Voador {
	
	public void ligarTurbina() {
		System.out.println("Aeronave ligando turbina");
	}
	
	public void ligarHelice() {
		System.out.println("Aeronave ligando helice");
	}
	
}


Classe Aviao

package faculdade.poo.arrays;

public class Aviao extends Aeronave implements Voador{
	
	@Override
	public void ligarTurbina() {
		System.out.println("Aviao ligando turbina");
	}
	
	public void voar() {
		System.out.println("Aviao voando");
	}
}


Classe Helicoptero

package faculdade.poo.arrays;

public class Helicoptero extends Aeronave implements Voador{
	
	@Override
	public void ligarHelice() {
		System.out.println("Helicoptero ligando helices");
	}
	public void voar() {
		System.out.println("Helicoptero voando");
	}
}


Classe Principal

package faculdade.poo.arrays;

import java.util.*;	

public class Principal {
	
	public static int gerarNumeroAleatorio() {
		Random gerador = new Random();
		int num = gerador.nextInt(100);
		return num;
	}
	public static int gerarTamanhoArray() {
		Random gerador = new Random();
		int index = gerador.nextInt(100);
		return index;
	}
	
	public static Voador[] criaArray(Voador array[]) {
		int index = Principal.gerarTamanhoArray();
		for(int i=0;i<index;i++) {
			int aux = new Principal().gerarNumeroAleatorio();// chamada da função que gerara numero aleatorio para decidir se sera criado objeto Aviao ou Helicoptero
			if(aux%2==0) {
				array[i] = new Aviao();
			}else if(aux%2!=0) {
				array[i] = new Helicoptero();
			}
		}
		return array;
	}
	public static Voador[] fazerDecolar(Voador array[]) {
		new Principal().criaArray(array);
		for(int i=0;i<array.length;i++) {
			if(array[i] instanceof Aviao) {
				Aviao a = (Aviao)array[i].ligarTurbina();//trecho onde eh ocorre o erro
			}else if(array[i] instanceof Helicoptero) {
				Helicoptero h = (Helicoptero)array[i].ligarHelice();//trecho onde ocorre o erro
			}
		}
		return array;
		
	}
	

	public static void main(String[] args) {
		
		int index = Principal.gerarTamanhoArray();
		Voador [] a1 = new Aeronave[index];
		Principal.criaArray(a1);
		Principal.fazerDecolar(a1);

	}

}
Responder Citar

08/11/2018

Wendel Rios

Ahh sim, entendi o lance. Tipo nas linhas onde eu estava tentando fazer os castings, na verdade eu estava atribuindo o valor retornado dos meus metodos, as minhas variaveis, em vez de retornar o objeto do array ja ''casteado''. Por isso que nas linhas onde os erros ocorriam, ele dizia que tais metodos nao estavam definidos em Voador, pois naquela altura eu estava chamando um metodo nao definido no meu tipo da minha variavel de referencia que eh Voador. Entendi, primeiro eu faco o casting pra dps eu chamar o metodo da minha classe mais especifica. Valeu, Ballem
Responder Citar

08/11/2018

Ballem

Ahh sim, entendi o lance. Tipo nas linhas onde eu estava tentando fazer os castings, na verdade eu estava atribuindo o valor retornado dos meus metodos, as minhas variaveis, em vez de retornar o objeto do array ja ''casteado''. Por isso que nas linhas onde os erros ocorriam, ele dizia que tais metodos nao estavam definidos em Voador, pois naquela altura eu estava chamando um metodo nao definido no meu tipo da minha variavel de referencia que eh Voador. Entendi, primeiro eu faco o casting pra dps eu chamar o metodo da minha classe mais especifica. Valeu, Ballem

Isso mesmo e ainda tinha o problema dos seus métodos serem void e as variáveis precisavam de objetos Aviao e Helicoptero.
T+
Responder Citar

08/11/2018

Wendel Rios

Isso mesmo e ainda tinha o problema dos seus métodos serem void e as variáveis precisavam de objetos Aviao e Helicoptero.
T+


Sim, sim tinha esse problema tb, ja acertei o codigo e rodou tudo certinho, brigadoo.
Responder Citar