将可变参数作为不同类型传递给另一个方法

Passing varargs to another method as different type

我重构了一个 类。它应该是可序列化的。它有一个方法 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 并传递其对象可变参数。

public void bar(Object ... param) {
  foo(param);
}

在这一点上,我预计会收到将 Object[] 传递给 Serializable[] 的错误。事实上,如果它是基于可变参数的数组,我会的。

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

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

(我在 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 参数是否可序列化。

尽管可序列化数组的手动包装给代码增加了一些噪音,但这似乎是我的案例的最佳折衷方案。