Sign in to follow this  
tom_mai78101

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

Recommended Posts

tom_mai78101    693

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.

Share this post


Link to post
Share on other sites
Juliean    7077

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)

Edited by The King2

Share this post


Link to post
Share on other sites
SimonForsman    7642

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)

Share this post


Link to post
Share on other sites
tom_mai78101    693

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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this