一个Java方法多能定义多少参数 江都哪里有Java培训
一个Java方法,多能定义多少参数|江都仙女镇哪里有JAVA培训的?
在 JVM 中,一个 Java 方法,多能定义多少参数呢?这是一个很无聊的问题,即使能定义一万个,十万个,谁又会真的去这么做呢。
但是作为一个 coder,重要的不就是好奇心吗,没有好奇心,和一条咸鱼又有什么区别呢?本文作者就是这样一位充满好奇心的 coder。
让我好奇的是这个方法能有多少个类型参数。到目前为止,我敢说,Java 语言规范并没有谈及这个问题。
对于实现定义的限制可能是什么,我有两个猜测:
编译器会设置一个可预测的限制,如 255 或 65535。
编译器的紧急行为会由于实现细节(堆栈溢出或同样不可预测/不相关的东西)而设置意外的限制。
我不想在源代码上测试我那点可怜的 C++技巧,所以我决定只测试编译器做了什么。我写了一个 Python 脚本,它使用二进制搜索找到少的致错类型参数。
生成方法很简单。幸运的是,我们不必使用任何类型参数,只需以<a,b,c…>的形式发出它们:
运行二进制搜索可以得到输出
这个错误有点模糊,但事后看来是可以预见的。编译器生成的类文件包含许多字符串,包括类中每个方法的方法签名。这些字符串存储在常量池中,常量池中的条目大为 65535 字节,这是由 JVM 规范规定的限制。
所以,我之前的猜测都不完全正确。类型参数的大数目是一个突现特征(emergent property),而不是一个明确的决定。不过,并不是编译器本身的实现导致了错误。
相反,JVM 的类文件格式限制了可以在类文件中表示的类型参数的数量。这是真的,尽管 JVM对泛型一无所知。这也意味着类型参数的大数目完全取决于如何编写方法。
我尝试了一种新的编码类型参数的方法(先前链接文件中的 write_Type_Compact),使用完整的合法 ASCII 字符(A-Z、a-z、$和_)。该实现有点过于复杂,因为可以使用字符 0~9,但不能是标识符的初始字符,因为 Java 关键字不能作为类型参数出现。我只是用等长的 UTF-8 字符替换了短单词「if」和「do」。更紧凑的编码将参数数量从 2776 增加到 3123。
不方便的是,_A 是一种合法的 Java 标识符,但 _ 不是。谢天谢地,我的编码在不使用初始_情况下就生成了 3392 个 2 字节类型参数,因此我觉得没有必要进行簿记以发出初始字符_。
【报名地址】:
扬州市江都区仙女镇工农路15号和业大厦四楼(江都商城往西100米海澜之家楼上电梯直达)
咨询电话:180**121***34719(微信同号)/0514-86733278 戴老师
友情提醒:周一至周日 8:30—20:30 节假日照常报名
在 JVM 中,一个 Java 方法,多能定义多少参数呢?这是一个很无聊的问题,即使能定义一万个,十万个,谁又会真的去这么做呢。
但是作为一个 coder,重要的不就是好奇心吗,没有好奇心,和一条咸鱼又有什么区别呢?本文作者就是这样一位充满好奇心的 coder。
让我好奇的是这个方法能有多少个类型参数。到目前为止,我敢说,Java 语言规范并没有谈及这个问题。
对于实现定义的限制可能是什么,我有两个猜测:
编译器会设置一个可预测的限制,如 255 或 65535。
编译器的紧急行为会由于实现细节(堆栈溢出或同样不可预测/不相关的东西)而设置意外的限制。
我不想在源代码上测试我那点可怜的 C++技巧,所以我决定只测试编译器做了什么。我写了一个 Python 脚本,它使用二进制搜索找到少的致错类型参数。
生成方法很简单。幸运的是,我们不必使用任何类型参数,只需以<a,b,c…>的形式发出它们:
运行二进制搜索可以得到输出
这个错误有点模糊,但事后看来是可以预见的。编译器生成的类文件包含许多字符串,包括类中每个方法的方法签名。这些字符串存储在常量池中,常量池中的条目大为 65535 字节,这是由 JVM 规范规定的限制。
所以,我之前的猜测都不完全正确。类型参数的大数目是一个突现特征(emergent property),而不是一个明确的决定。不过,并不是编译器本身的实现导致了错误。
相反,JVM 的类文件格式限制了可以在类文件中表示的类型参数的数量。这是真的,尽管 JVM对泛型一无所知。这也意味着类型参数的大数目完全取决于如何编写方法。
我尝试了一种新的编码类型参数的方法(先前链接文件中的 write_Type_Compact),使用完整的合法 ASCII 字符(A-Z、a-z、$和_)。该实现有点过于复杂,因为可以使用字符 0~9,但不能是标识符的初始字符,因为 Java 关键字不能作为类型参数出现。我只是用等长的 UTF-8 字符替换了短单词「if」和「do」。更紧凑的编码将参数数量从 2776 增加到 3123。
不方便的是,_A 是一种合法的 Java 标识符,但 _ 不是。谢天谢地,我的编码在不使用初始_情况下就生成了 3392 个 2 字节类型参数,因此我觉得没有必要进行簿记以发出初始字符_。
【报名地址】:
扬州市江都区仙女镇工农路15号和业大厦四楼(江都商城往西100米海澜之家楼上电梯直达)
咨询电话:180**121***34719(微信同号)/0514-86733278 戴老师
友情提醒:周一至周日 8:30—20:30 节假日照常报名