本文主要是介绍JAVA可变参数的一个问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
今天看一同事叫我看 fastjson jar包中的一段代码 在 JSON.class 中,问我这个怎么调用的。内容如下
public static <T> T parseObject(String text, Class<T> clazz) {return parseObject(text, clazz);}
我一看我就觉得这肯定死循环呀,递归调用没有结束的判断条件,内存耗完以后栈溢出呗。但是开源的jar包里面怎么可能会有这种错误呢。何况都用了这么久了呢。
debug调试, 发现经过这个方法以后,跳到了重载的另一个带可变参数的方法里:
public static <T> T parseObject(String json, Class<T> clazz, Feature... features) {return parseObject(json, clazz, ParserConfig.global, (ParseProcess)null, DEFAULT_PARSER_FEATURE, features);}
但是,有固定参数和可变参数的重载方法,默认优先级:固定参数方法 > 可变参数方法,怎么会跳到可变参数的方法里面去呢。
原来,我在.class 文件里面看到的代码,是编译过后的,跟源码是不一样的。Download Sources 以后才发现,最初以为的递归调用根本不是递归,是这样的:
public static <T> T parseObject(String text, Class<T> clazz) {return parseObject(text, clazz, new Feature[0]);}
原来编译后,空的Feature[] 列表被丢掉了。
这篇关于JAVA可变参数的一个问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!