从SuperClass转换子类时出现异常java.lang.classCastException

时间:2016-10-02 18:15:42

标签: java exception casting subclass superclass

当我尝试使用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 +"]";
    }

}

1 个答案:

答案 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