当我尝试使用getInfoDerivada()
中的方法Desguace
时,我在标题中收到错误:
线程“main”中的异常java.lang.ClassCastException: es.unex.cum.mdp.sesion2.Vehiculo无法转换为 es.unex.cum.mdp.sesion2.Moto at es.unex.cum.mdp.sesion2.Desguace.getInfoDerivada(Desguace.java:93)at es.unex.cum.mdp.sesion2.Main.main(Main.java:21)
我不知道如何强制子类Moto
使用超类getPotencia()
中的方法Vehiculo
。
由于
package es.unex.cum.mdp.sesion2;
public class Main {
public static void main(String[] args) {
Persona p = new Persona();
Vehiculo v = new Coche("Renault","Asd",p,1234,"azul");
Vehiculo v1 = new Moto("a","b",p,2345,25);
if(v.getClass().equals(Coche.class))
System.out.println("holi 1.0");
Desguace d = new Desguace("pepe",2);
if(d.addVehiculo(v))
System.out.println("ok");
if(d.addVehiculo(v1))
System.out.println("ok");
String a = d.getInfoDerivada(1);
String b = v1.toString();
System.out.println(b);
System.out.println(a);
}
}
Class Desguace
package es.unex.cum.mdp.sesion2;
import java.util.Arrays;
public class Desguace {
protected String nombre;
protected Vehiculo [] vehiculos;
protected Integer cont;
public Desguace() {
nombre = "";
vehiculos = new Vehiculo[0];
cont = 0;
}
public Desguace(String nombre, int cant) {
this.nombre = nombre;
vehiculos = new Vehiculo[cant];
cont = 0;
}
public boolean addVehiculo (Vehiculo v){
for(int i = 0; i < cont; i++)
if(vehiculos[i].getBastidor() == v.getBastidor())
return false;
if(cont<vehiculos.length){
vehiculos[cont] = new Vehiculo(v);
cont = cont + 1;
return true;
}
else
return false;
}
public Vehiculo getVehiculoBastidor(Integer bastidor){
if(bastidor < 0)
return null;
for(int i = 0; i < cont; i++){
if(vehiculos[i].getBastidor()==bastidor)
return vehiculos[i];
}
return null;
}
public boolean addPiezaVehiculo(Pieza p, Integer bastidor){
if(bastidor < 0)
return false;
for(int i = 0; i < cont; i++){
if(vehiculos[i].getBastidor() == bastidor){
for(int j = 0; j < vehiculos[i].getCont(); j++){
if(vehiculos[i].getPiezaV(j).equals(p)){
vehiculos[i].getPiezaV(j).setContador(vehiculos[i].getPiezaV(j).getContador() + p.getContador());
return true;}
else{
if(vehiculos[i].getCont() < 3){
vehiculos[i].addPiezaV(p);
vehiculos[i].setCont(vehiculos[i].getCont()+1);
}
else
return false;
}
}
}
}
return false;
}
public Vehiculo mayorStock(){
int aux = 0;
if(vehiculos[aux] == null)
return null;
for(int i = 1; i < cont; i++){
if(vehiculos[aux].getCont() < vehiculos[i].getCont())
aux = i;
}
return vehiculos[aux];
}
public String getInfoDerivada(int pos){
if(pos < 0 || pos >= cont){
return null;}
if(vehiculos[pos].getClass() == Coche.class){
return ((Coche)vehiculos[pos]).getColor();
}
if(vehiculos[pos].getClass() == Moto.class){
return String.valueOf(((Moto)vehiculos[pos]).getPotencia());
}
if(vehiculos[pos].getClass() == Camion.class){
return String.valueOf(((Camion)vehiculos[pos]).getTonelaje());
}
return String.valueOf(((Moto)vehiculos[pos]).getPotencia());
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public Integer getCont() {
return cont;
}
public void setCont(Integer cont) {
this.cont = cont;
}
public Vehiculo[] getVehiculos() {
return vehiculos;
}
@Override
public String toString() {
return "Desguace [nombre=" + nombre + "]";
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Desguace other = (Desguace) obj;
if (cont == null) {
if (other.cont != null)
return false;
} else if (!cont.equals(other.cont))
return false;
if (nombre == null) {
if (other.nombre != null)
return false;
} else if (!nombre.equals(other.nombre))
return false;
if (!Arrays.equals(vehiculos, other.vehiculos))
return false;
return true;
}
}
班级 Vehiculo
package es.unex.cum.mdp.sesion2;
public class Vehiculo {
protected String marca;
protected String modelo;
protected Persona propietario;
protected Pieza[] piezas;
protected Integer bastidor;
protected Integer cont;
public Vehiculo() {
marca = "";
modelo = "";
propietario = new Persona();
bastidor = 0;
piezas=new Pieza[3];
for(int i = 0; i < piezas.length; i++)
piezas[i] = new Pieza();
cont=0;
}
public Vehiculo(String marca, String modelo, Persona p, Integer bastidor) {
this.marca = marca;
this.modelo = modelo;
this.bastidor = bastidor;
propietario = new Persona(p.getNombre(),p.getDni(),p.getEdad());
piezas=new Pieza[3];
for(int i = 0; i < piezas.length; i++)
piezas[i] = new Pieza();
cont = 0;
}
public Vehiculo(Vehiculo p) {
this(p.getMarca(),p.getModelo(),p.propietario, p.getBastidor());
}
public boolean addPiezaV(Pieza p) {
for(int i = 0; i < cont; i++){
if(piezas[i].equals(p))
piezas[i].setContador(piezas[i].getContador()+p.getContador());
}
piezas[cont].setId(p.getId());
piezas[cont].setNombre(p.getNombre());
piezas[cont].setContador(p.getContador());
cont = cont + 1;
return true;
}
public Pieza getPiezaV(int pos) {
if(pos >= piezas.length || pos < 0)
return null;
else
return piezas[pos];
}
//getter y setter
public String getMarca() {
return marca;
}
public void setMarca(String marca) {
this.marca = marca;
}
public String getModelo() {
return modelo;
}
public void setModelo(String modelo) {
this.modelo = modelo;
}
public Integer getBastidor() {
return bastidor;
}
public void setBastidor(Integer bastidor) {
this.bastidor = bastidor;
}
public Integer getCont(){
return cont;
}
public void setCont(Integer cont){
this.cont = cont;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Vehiculo other = (Vehiculo) obj;
if (bastidor == null) {
if (other.bastidor != null)
return false;
} else if (!bastidor.equals(other.bastidor))
return false;
if (cont == null) {
if (other.cont != null)
return false;
} else if (!cont.equals(other.cont))
return false;
if (marca == null) {
if (other.marca != null)
return false;
} else if (!marca.equals(other.marca))
return false;
if (modelo == null) {
if (other.modelo != null)
return false;
} else if (!modelo.equals(other.modelo))
return false;
if (propietario == null) {
if (other.propietario != null)
return false;
} else if (!propietario.equals(other.propietario))
return false;
return true;
}
}
Class Moto
package es.unex.cum.mdp.sesion2;
public class Moto extends Vehiculo {
protected Integer potencia;
public Moto(){
super();
potencia = 0;
}
public Moto(String marca, String modelo, Persona p, Integer bastidor, Integer potencia){
super(marca,modelo,p,bastidor);
this.potencia = potencia;
}
public Integer getPotencia() {
return potencia;
}
public void setPotencia(Integer potencia) {
this.potencia = potencia;
}
@Override
public String toString() {
return "Moto[marca=" + marca + ", modelo=" + modelo + ", bastidor=" + bastidor + ", potencia=" + potencia +"]";
}
}
答案 0 :(得分:0)
您可以将Moto
转换为Vehiculo
而无需检查任何内容,并且需要将其Moto
转换为Vehiculo
的子类,但如果您如果您Vehiculo
的实例是使用Moto
的{{1}}实例,则需要首先检查,因为instanceof
的实例不是Vehiculo
的实例{1}}当你得到Moto
时,这是你的问题。更糟糕的是,根据您的错误消息,您尝试将ClassCastException
的实例强制转换为Vehiculo
的实例,这只是不可能。
Moto
当您到达最后一个案例时,问题出在方法if (vehiculos[pos] instanceof Moto) {
// Here we can safety cast to a moto
Moto moto = (Moto) vehiculos[pos];
...
}
中,您将其转换为getInfoDerivada
,但事实并非如此,因为我们已经知道它不是{{1}的实例}}
您的代码应该是这样的:
Moto
您的错误实际上在Moto
,您应该直接指定提供的public String getInfoDerivada(int pos){
if(pos < 0 || pos >= cont){
return null;
}
if(vehiculos[pos] instanceof Coche){
return ((Coche)vehiculos[pos]).getColor();
} else if(vehiculos[pos] instanceof Moto){
return String.valueOf(((Moto)vehiculos[pos]).getPotencia());
} else if(vehiculos[pos] instanceof Camion){
return String.valueOf(((Camion)vehiculos[pos]).getTonelaje());
}
throw new IllegalStateException(
String.format("Unknown type: %s", vehiculos[pos].getClass().getName())
);
}
实例,而不是使用它创建addVehiculo
的新实例。
Vehiculo
更好的方法是在类Vehiculo
中添加一个新方法public boolean addVehiculo (Vehiculo v){
...
if(cont<vehiculos.length){
vehiculos[cont] = v;// instead of new Vehiculo(v);
...
}
...
}
,您将为其提供默认实现,然后在子类上覆盖它,如果需要,您的代码将只是:
getInfoDerivada