Is there a workaround for downcasting a superclass returned from a static method to its subclass?

Started by
3 comments, last by tom_mai78101 11 years ago

Currently, I have a static method that loads a file.


//class Model is a superclass.

public static Model loadOBJModel(String filename){
    Model model = new Model(); 
    //...
    // Loading model codes.
    //...
    return model;
}

And I want to downcast the object Model that was returned by the static method to a Cube class. The Cube class extends the Model class.

I realized that downcasting will cause RuntimeException errors when it is starts the downcasting. I'm looking for a workaround to this method, and was wondering if anyone else have it?


/*What the code I came up with before realizing the downcast problem. This code snippet is what I want the Model static message to change into its subclass.*/

Cube cube = (Cube) Model.loadOBJModel("cube.obj");

Thanks in advance.

Advertisement

If you type "java downcast" in google, this is the first result:

http://stackoverflow.com/questions/380813/downcasting-in-java

In short, the "workaround goes as this:


public void doit(A a) {
    if(a instanceof B) {
        // needs to cast to B to access draw2 which isn't present in A
        // note that this is probably not a good OO-design, but that would
        // be out-of-scope for this discussion :)
        ((B)a).draw2();
    }
    a.draw();
}

(As a side note, you might want to get used to googling questions that don't need an extraordenary explanation or can be put in few words before you post here - even better, you might google or search the forum before anyway, thats going to be faster for you and reduce the amount of quadriplicated q&a out there drastically. if there is something unclear, you can ask afterwards anyway)

You might also want to consider making Cube not be a model but rather have a model.

o3o

Currently, I have a static method that loads a file.


//class Model is a superclass.

public static Model loadOBJModel(String filename){
    Model model = new Model(); 
    //...
    // Loading model codes.
    //...
    return model;
}
And I want to downcast the object Model that was returned by the static method to a Cube class. The Cube class extends the Model class.

I realized that downcasting will cause RuntimeException errors when it is starts the downcasting. I'm looking for a workaround to this method, and was wondering if anyone else have it?

/*What the code I came up with before realizing the downcast problem. This code snippet is what I want the Model static message to change into its subclass.*/

Cube cube = (Cube) Model.loadOBJModel("cube.obj");
Thanks in advance.


You can't safely downcast a Model instance to a Cube instance unless the instance is a Cube in the first place (The King2s code checks if the Model is a Cube before it attempts to downcast which makes it safe, that won't really work in your case though since the model you get from loadOBJModel probably isn't a Cube and thus his code will not attempt to downcast it).

All your Cubes are Models, but a Model is only a Cube if it was created as a Cube.

Thus:
Model modelCube = (Model)new Cube(); //this is fine, we can always treat Cube as a Model since Cube has inherited or re-implemented all public methods and variables from Model)
Cube cube = (Cube)modelCube; //downcast modelCube to Cube , this is also fine since modelCube really is a Cube, we just treated it as a mere Model for a bit.

Cube model = (Cube)new Model(); //This will raise an exception, a Model is not a Cube since Model doesn't inherit or implement Cubes public interface and thus it cannot be treated as a Cube) (This is basically what you try to do, and it doesn't and will not work).

In your case you should most likely let Cube have a Model instead, or just skip the Cube class entierly (I don't quite see what it would do that Model doesn't do allready)
[size="1"]I don't suffer from insanity, I'm enjoying every minute of it.
The voices in my head may not be real, but they have some good ideas!

Letting my Cube have a Model instance is a good idea. Never thought about it before. I guess this problem is fixed. Thank you everyone for the inputs.

(As a side note, you might want to get used to googling questions that don't need an extraordenary explanation or can be put in few words before you post here - even better, you might google or search the forum before anyway, thats going to be faster for you and reduce the amount of quadriplicated q&a out there drastically. if there is something unclear, you can ask afterwards anyway)

I agree with your advice. I'm sorry to cause even more unnecessary questions. I'm still learning some of the newer quick tricks in Google searching for questions I have problems with.

This topic is closed to new replies.

Advertisement