为什么L是引用类型的前缀(而不是其他一些字母)?

Gre*_*ant 9 java

为什么L选择类型签名中引用的前缀?是否L代表某种东西,如B代表byte,I代表int什么?或者它被选中是因为C已经分配给了char

例如,

System.out.println( new String[0].getClass().getName() );
Run Code Online (Sandbox Code Playgroud)

产量:

[Ljava.lang.String;
Run Code Online (Sandbox Code Playgroud)

我已经知道Java规范Class.getName方法 javadoc 中的解释.

Hol*_*ger 6

此字符源自JVM内部签名和类名表示.

请参阅JVM规范§4.3.2.字段描述符:

  B   byte       signed byte
  C   char       Unicode character code point in the Basic Multilingual Plane,
                 encoded with UTF-16
  D   double     double-precision floating-point value
  F   float      single-precision floating-point value
  I   int        integer
  J   long       long integer
  L ClassName ;  reference             an instance of class ClassName
  S   short      signed short
  Z   boolean    true or false
  [   reference  one array dimension

数组类型由a [为每个维度组成,后跟其元素签名,例如[Ifor int[].同样,Object[][Ljava/lang/Object;内部代表.

看来,当从内部类名称转换为应用程序可见名称(即返回者Class.getName())首次实现时,它实现为转换/.但不关心数组表示法.后来,由于兼容性原因,它没有改变.


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

  • 好吧,我抓住了一个"橡树语言规范0.2",它已经包含了"long"(在未签名类型中).即使有一段时间没有"long"类型,我想当时删除了无符号类型(当它成为Java时),有可能重新分配字符.也许这意味着,类型需要**L**墨水,或者...... (4认同)
  • 是.但为什么`L`具体而不是其他一些字母呢?这是武断的吗?或者它有一些意义吗? (2认同)
  • 我不知道原因(还)但一定有一个。很明显,原始类型的字母只是从它们的名字派生出来的,除了冲突的那个,即“Z”代表“布尔”,因为“B”已经被用于“字节”。在那里,`long` 必须和`J` 一起使用,因为`L` 已经为引用类型保留了。我想,如果您可以选择*任何*字符,您就不会创建名称冲突,因此必须有理由为引用类型选择“L”。 (2认同)