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

我重构了我的一个类。 它应该是可序列化的。 它有一个方法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[]则抛出一个错误。 这可能是你能做的最好的。


通过将参数类型从可变参数改为数组来解决它:

public void foo(Serializable[] param) { }

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

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

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

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

链接地址: http://www.djcxy.com/p/78961.html

上一篇: Passing varargs to another method as different type

下一篇: Scala – Make implicit value classes available in another scope