I have a hierarchy where Square, Triangle and Circle all extend from Shape. I have a working method:
public void someMethod() {
File file = new File("File_with_squares");
ThirdPartyClass foo = new ThirdPartyClass();
Square[] squares = foo.someMajicMethod(Square[].class,file);
for (Square square: squares)
square.draw();
}
Now I want to make this method generic so that it can accept any shape. I want to be able to call it someMethod(Triangle.class,new File("File_with_triangles")
or someMethod(Circle.class, new File("File_with_circles")
. I am trying like this:
public void someMethod(Class<? extends Shape> type, File shapeFile) {
ThirdPartyClass foo = new ThirdPartyClass();
#### What goes here??? ####
for (Shape shape: shapes)
shape.draw();
}
What should be there at #### What goes here??? #### ???
Assuming ThirdPartClass.someMajicMethod has a signature something like this:
public <T> T someMajicMethod(Class<T> class1, File file);
Then you should be able to do something like this:
public void someMethod(Class<? extends Shape> type, File shapeFile) {
ThirdPartyClass foo = new ThirdPartyClass();
@SuppressWarnings("unchecked")
Class<? extends Shape[]> arrayType =
(Class<? extends Shape[]>) Array.newInstance(type, 0).getClass();
assert Shape[].class.isAssignableFrom(arrayType);
Shape[] shapes = foo.someMajicMethod(arrayType, shapeFile);
for (Shape shape: shapes)
shape.draw();
}
So if you call someMethod(Triangle.class, file)
, then arrayType
will be Triangle[].class
in the call to someMajicMethod
.
Though you may find it simpler to have someMethod take the array type as a parameter instead of the element type so you can avoid that step.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With