我重构了我的一个类。它应该可序列化。它有一个方法foo,其参数类型为对象varargs。
它可能看起来像:
public class MyClass {
public void foo(Object ... param) {
// do sth
}
}
重构后:
public class MyClass implements Serializable {
public void foo(Serializable ... param) {
// do sth
}
}
现在,还有另一个方法调用foo并传递其对象varargs。
public void bar(Object ... param) {
foo(param);
}
此时,我希望收到将 Object[] 传递给 Serializable[] 的错误。事实上,如果是 varargs 上的数组,我会的。
但相反,它会将对象变量包装到可序列化的数组中。Foo 接收一个包含 1 个元素的可序列化数组,即具有传递的 varargs 的对象数组。
为什么会这样?如何强制这种错误的用法在编译时实际抛出错误?
(我在Java 1.8中使用eclipse neon
>Serializable...
将接受任意数量的参数,只要它们都是可序列化的。
数组是可序列化的。
因此,它不会引发编译器错误(请注意,因为Java是静态类型的,所以它不会是运行时错误)。
您可以做的是签入参数是什么foo
,如果param.length == 1 && param[0] instanceof Object[]
则抛出错误。这可能是你能做的最好的事情。
通过将参数类型从 varargs 更改为数组来解决它:
public void foo(Serializable[] param) { }
// called like this
foo(new Serializable[] { param1, param2, param3 } );
// or this
public void bar(Serializable[] param) {
foo(param);
}
这样,我在编译时重新获得了类型安全性,而无需额外的开销来检查varargs参数是否可序列化。
尽管可序列化数组的手动包装会给代码增加一些噪音,但这似乎是我的情况的最佳折衷方案。