java—方法能否接收数组或iterable?

gywdnpxw  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(309)

for循环(如foreach)接受数组或iterables,是否有一个同时包含这两种类型的输入类型,或者我必须编写一个重载方法?我可以用java语言:

public void serialize (ArrayOrIterable xxx){
  for (Object x: xxx) {
     x.doSomething()
  }
}

还是我唯一的选择是重复代码?

public void serialize (Object[] xxx){
  for (Object x: xxx) {
     x.doSomething()
  }
}

public void serialize (Iterable xxx){
  for (Object x: xxx) {
     x.doSomething()
  }
}

编辑结论
更好的是,类结构实际上是一个抽象类及其实现,因此我可以在asbtract类中定义数组的行为,任何实现只需要覆盖一个方法。

public abstract class Serializer {

    public final void serialize(Object[] input) {
         serialize(Arrays.ssList(input));
    }

    public abstract void serialize(Iterable input);

}
uplii1fm

uplii1fm1#

不幸的是,java没有一个合理的语法来实现这一点,就像 Iterable 数组和数组是离散类型。但是,您可以改进目前的代码,删除重复的 doSomething() 通过将数组 Package 为 List 通过调用接口 Arrays.asList :

public void serialize (Object[] xxx){
  serialize (Arrays.asList(xxx));
}

public void serialize (Iterable xxx){
  for (Object x: xxx) {
     x.doSomething()
  }
}
628mspwn

628mspwn2#

您必须有两个不同的方法,因为数组不实现 Iterable .
但是,通过将数组 Package 为带有 Arrays.asList() :

public void serialize (Object[] xxx){
    serialize(Arrays.asList(xxx));
}

public serialize (Iterable xxx){
    for(Object x: xxx) {
       x.doSomething()
    } 
}

这样至少你的逻辑只能用一种谨慎的方法来处理。

相关问题