Reputation: 25
I refactored one of my classes. It should be made serializable. It has a method foo with a parameter of type object varargs.
It may look like:
public class MyClass {
public void foo(Object ... param) {
// do sth
}
}
And after the refactoring:
public class MyClass implements Serializable {
public void foo(Serializable ... param) {
// do sth
}
}
Now, there is another method calling foo and passing its object varargs.
public void bar(Object ... param) {
foo(param);
}
At this point, I expected to get an error for passing an Object[] to Serializable[]. In fact, if it would be arrays over varargs, I would.
But instead it will wrap the object varargs into a serializable array. foo receives a serializable array with 1 element, that is an object array with the passed varargs.
Why is this happening? How can I force this wrong usage to actually throw an error at compile-time?
(I am using eclipse neon with Java 1.8
Upvotes: 1
Views: 1496
Reputation: 25
Solved it by changing the parameter type from varargs to array:
public void foo(Serializable[] param) { }
// called like this
foo(new Serializable[] { param1, param2, param3 } );
// or this
public void bar(Serializable[] param) {
foo(param);
}
This way I regain the type safety at compile time without additional overhead for checking that the varargs parameter is serializable.
Although the manual wrapping of the serializable array adds some noise to the code, this seems to be the best compromise for my case.
Upvotes: 0
Reputation: 5425
Serializable...
will take any number of arguments as long as they're all serializable.
Arrays are serializable.
So, it's not going to raise compiler errors (note that because Java is statically typed, it won't be a runtime error).
What you can do is check in foo
what the argument is, and if param.length == 1 && param[0] instanceof Object[]
then throw an error. That's probably the best you can do.
Upvotes: 3