Erro de compilação

esse é o codigo

public abstract class Transporte {
	public abstract void locomover();
	
}

public interface Terrestre {

	public int numeroDeRodas();
}


public interface Fluvial {
	void flutuar();
	
}

public abstract class Automovel extends Transporte implements Terrestre {

	@Override
	public int numeroDeRodas() {
		
		return 4;
	}

	@Override
	public void locomover() {
		
		
	}
public class Anfibio extends Automovel implements Fluvial {

	@Override
	public void flutuar() {
		
	}

}

public class Navio extends Transporte implements Fluvial {

	@Override
	public void locomover() {
		
		
	}

	@Override
	public void flutuar() {
		
		
	}

}

public class Programa {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Anfibio a1 = new Anfibio();
		Navio n = new Navio();
		
		Transporte t1 = new Automovel();
		Transporte t2 = new Anfibio();
		t2 = n;
		t2.flutuar();
		t2 = a1;
		t2.locomover();
		
		Terrestre ter = new Anfibio();
		ter.numeroDeRodas();
		Anfibio a2 = (Anfibio)ter;
		Automovel aut = ter;
		a2.flutuar();
		t2 = (Transporte) n;
		t2.locomover();
		Terrestre ter2 = (Terrestre) t2;
		ter2.numeroDeRodas();
		
	}
	

}

alguém pode me responder porque não consigo instanciar o tipo automovel?

Caso esteja se referindo a linha:

Não é possível pois o objeto ter, mesmo sendo objeto da classe Terrestre, foi instanciado por outras sub classes (no caso, Anfibio). Como anfibio não é um automóvel, não é possível instanciar o objeto aut em questão

1 curtida

Complementando a resposta do darlan, você declarou a variável ter como sendo do tipo Terrestre, que é uma interface e não é nenhum subtipo de Automovel.

O compilador não sabe que a referência dessa variável aponta para um objeto do tipo Anfibio, por isso ele não deixa você fazer a atribuição Automovel aut = ter.

Entretanto você, como programador, tem a certeza absoluta de que a variável ter possui referência à um objeto do tipo Anfibio, que é uma subtipo de Automovel então você pode fazer um cast, conforme abaixo:

	Terrestre ter = new Anfibio();  // aqui você tem a certeza de que ter é um Anfibio e um Anfibio é um Automovel
	ter.numeroDeRodas();
	Anfibio a2 = (Anfibio) ter;
	Automovel aut = (Automovel) ter; // aqui você diz que o compilador pode ficar tranquilo pois o objeto ter é um Automóvel
2 curtidas

tenho dúvida nessa linha

Automovel é uma classe abstrata. Não é possível instanciar classes abstratas.

1 curtida

não tinha me atentado a esse detalhe, vlw

1 curtida