Jump to content

  • Log In with Google      Sign In   
  • Create Account


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


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
4 replies to this topic

#1 tom_mai78101   Members   -  Reputation: 566

Like
0Likes
Like

Posted 05 April 2013 - 12:59 PM

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.



Sponsor:

#2 Juliean   GDNet+   -  Reputation: 2208

Like
0Likes
Like

Posted 05 April 2013 - 01:06 PM

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, 05 April 2013 - 01:09 PM.


#3 Waterlimon   Crossbones+   -  Reputation: 2316

Like
3Likes
Like

Posted 05 April 2013 - 01:28 PM

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

Waterlimon (imagine this is handwritten please)


#4 SimonForsman   Crossbones+   -  Reputation: 5720

Like
1Likes
Like

Posted 05 April 2013 - 02:39 PM

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)
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!

#5 tom_mai78101   Members   -  Reputation: 566

Like
0Likes
Like

Posted 06 April 2013 - 12:51 AM

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.






Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS