【问题标题】:Why is L the prefix for reference types (instead of some other letter)? [duplicate]为什么 L 是引用类型的前缀(而不是其他字母)? [复制]
【发布时间】:2015-12-22 10:49:51
【问题描述】:

为什么选择L 作为类型签名中引用的前缀? L 是否代表某些东西,例如 B 代表 byteI 代表 int?还是因为C 已经分配给char 而被选中?

例如,

System.out.println( new String[0].getClass().getName() );

产量:

[Ljava.lang.String;

我已经知道Java specClass.getName method javadoc 中的解释。

【问题讨论】:

标签: java


【解决方案1】:

这个字符源于 JVM 内部签名和类名表示。

JVM Specification §4.3.2. Field Descriptors:

B 字节 有符号字节 基本多语言平面中的 C char Unicode 字符代码点, 用 UTF-16 编码 D double 双精度浮点值 F float 单精度浮点值 我 int 整数 J long long 整数 L 类名;引用类 ClassName 的实例 S 短 有符号短 Z 布尔值 true 或 false [引用一维数组

数组类型由每个维度的[ 组成,后跟它们的元素签名,例如[Iint[]。类似地,Object[] 在内部由[Ljava/lang/Object; 表示。

似乎,当从内部类名到应用程序可见名的转换,即由Class.getName() 返回的第一次实现时,它被实现为只是将/ 转换为.,但不关心数组符号。后来,出于兼容性原因,它没有更改。


请注意,Java 8 引入了 getTypeName() 来解决该问题,即 String[].class.getTypeName() 产生 java.lang.String[]

【讨论】:

  • 是的。但是为什么要专门为L 而不是其他字母呢?是任意的吗?还是有什么意义?
  • 我还不知道原因,但肯定有原因。很明显,原始类型的字母只是从它们的名称派生而来,除了有冲突的那个,即Z 代表boolean,因为B 已经用于byte。在那里,long 必须与J 一起使用,因为L 已经为引用类型保留。我想,如果您可以选择 any 字符,您不会产生名称冲突,因此选择 L 作为引用类型一定是有原因的。
  • @bayou.io:按哪个排序?
  • 为什么保留'L'以供参考,而不是long,这似乎更自然。除非,long 类型是后面引入的?
  • 好吧,我拿了一个“Oak Language Specification 0.2”,它已经包含long(在无符号类型中)。即使有一段时间没有long 类型,我猜到那时,无符号类型已被删除(当它变成Java时),有可能重新分配字符。也许这意味着,类型需要L墨量,或者这样......
【解决方案2】:

“[”是数组的维度。所以“[”是一维数组,“[[”是二维数组,以此类推

“Ljava.lang.String”表示它是类 java.lang.String 的对象数组(即“L”)。

如果你有一个基元数组,比如int,它就是“[I”。其他原始类型有不同的字母。

【讨论】:

    【解决方案3】:

    [Ljava.lang.String;

    这里 [ 表示一个数组。 L 表示 java.lang.String 类型的类。这些是 JVM 为自己保留的用于识别 Java 数据类型的快捷方式。这类似于字节码内部使用的类型描述符。例如,对于原语,值是:[I 表示 int 数组,二维数组将是:[[I.

    这里有一个很好的解释:[L array notation - where does it come from?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-23
      • 2012-10-16
      • 1970-01-01
      • 2011-12-06
      • 2012-02-01
      • 1970-01-01
      相关资源
      最近更新 更多