2014-12-19

VarArgs简述

只需要明确一点即可,java方法的变长参数只是语法糖,其本质上还是将变长的实际参数 varargs 包装为一个数组。

所以

Object[] objs

Object... objs

被看作是相同的签名,在源码级别是不能同时存在的,因此,无法编译通过

VarArgs包装

包装方式(注意,下面的代码不是实际的实现,而是一个比喻说明):

  1. 如果实参是唯一且匹配形参varargs要求的数组(就是实参独占形参varargs),那么可以认为你已经替编译器干了这个活,所以可以看作不包装,直接使用这个数组
1
2
3
4
5
6
7
public void invoke(String...varargs){}

invoke(new String[]{"a", "b", "c"});
那么大致的调用过程如下:
public void invoke(String...varargs){
innerVarArgs = varargs;
}
  1. 如果实参是多个单独的变量(就是多个实参分享varargs),那么会将这多个参数包装成一个相应的类型数组
1
2
3
4
5
6
7
8
9
10
11
public void invoke(String...varargs){}

invoke("a", "b", "c");

那么大致的调用过程如下:
public void invoke(String...varargs){
innerVarArgs = new String[varargs.length];
for(int i = 0, size = varargs; i < size; i++){
innerVarArgs[i] = varargs[i];
}
}
更多 →
2014-12-19
更多 →
2014-12-04
更多 →
2014-12-03

按照字面意思的理解,应该可选的意思。一开始我还以为是类似python里面的默认参数用法呢,结果语义是指某个值可能有也可能没有(null)。
感觉名字取得不是很直观。。我觉得叫Nullable不是更好?

python:

1
2
3
def fn(a='default_value'):
print(a)
pass
更多 →
2014-12-02
更多 →
2014-11-19
更多 →
2014-11-14
更多 →
2014-11-14
更多 →
2014-07-12
更多 →
2014-01-15
更多 →