将varargs传递给另一种方法作为不同类型

时间:2017-11-02 17:36:38

标签: java arrays parameters variadic-functions

我重构了我的一个课程。它应该是可序列化的。它有一个方法foo,参数类型为object 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上的数组,我会的。

但它会将对象varargs包装成可序列化的数组。 foo接收一个带有1个元素的可序列化数组,这是一个带有传递的varargs的对象数组。

为什么会这样? 如何强制这个错误的用法在编译时实际抛出错误?

(我正在使用Java 1.8的eclipse neon

2 个答案:

答案 0 :(得分:3)

只要它们都是可序列化的,

Serializable...将接受任意数量的参数。

数组是可序列化的。

因此,它不会引发编译器错误(请注意,因为Java是静态类型的,所以它不会是运行时错误。)

您可以做的是检查foo参数是什么,如果param.length == 1 && param[0] instanceof Object[]则抛出错误。这可能是你能做的最好的事情。

答案 1 :(得分:0)

通过将参数类型从varargs更改为array来解决它:

public void foo(Serializable[] param) { }

// called like this
foo(new Serializable[] { param1, param2, param3 } );

// or this
public void bar(Serializable[] param) {
  foo(param);
}

这样我在编译时重新获得了类型安全性,而没有额外的开销来检查varargs参数是否可序列化。

虽然可序列化阵列的手动包装会给代码增加一些噪音,但这似乎是我个案的最佳折衷方案。