2015-09-24 7 views
7

Lがタイプシグネチャの参照のプレフィックスとして選択されたのはなぜですか? Lは、Bbyteを表し、Iintを表します。 Ccharに割り当てられていますか?私はすでにJava specでの説明とClass.getName methodのjavadocを知ってるLが(他の文字の代わりに)参照型の接頭辞となるのはなぜですか?

[Ljava.lang.String; 

:たとえば

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

利回り。

+5

http://stackoverflow.com/questions/5085889/l-array-notation-where-does-it-come-fromとhttp://stackoverflow.com/questions/3442090/java-what-is-this-ljava-lang-object –

+0

これはありません。配列接頭辞は '[' '。 – chrylis

+0

なぜ 'L'は別の文字の代わりに、なぜですか?それは恣意的でしたか?それとも何か意味がありましたか? – GreenGiant

答えて

4

この文字は、JVMの内部署名とクラス名の表現に由来します。

JVM Specification §4.3.2. Field Descriptors参照:

 
    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

配列型は、例えば、その素子署名、続いて、各ディメンションの[から成りint[][I。同様に、Object[][Ljava/lang/Object;で内部的に表されます。

すなわちClass.getName()によって返されるアプリケーション可視名の内部クラス名からの変換は、最初に実施された場合、それはちょうど配列表記ため.ではなく気にせず/を変換するように実施された、と思われます。後で、互換性の理由から変更されていませんでした。


のJava 8の問題を解決するためにgetTypeName()を導入注、すなわちString[].class.getTypeName()利回りjava.lang.String[]

+1

はい。しかし、なぜ他の手紙の代わりに 'L'が具体的になぜですか?それは恣意的でしたか?それとも何か意味がありましたか? – GreenGiant

+0

私は理由は分かっていませんが(まだ)、あるはずです。プリミティブ型の文字は、 'B'がすでに' byte'のために使用されているため、 'boolean'のために' Z'が衝突するものを除いて、名前から単に導出されることは明らかです。そして、 'L 'はすでに参照型のために予約されていたので、' long'は 'J'と一緒に行かなければなりませんでした。あなたが*任意の*文字を選ぶことができれば、名前の衝突を作成しないだろうから、参照型に 'L'を選択する理由がなければなりません。 – Holger

+0

'long'は参照型の後に来ますか? – ZhongYu

0

"["は配列の次元です。 "["は1次元配列です。 "[["は2次元配列などです。

"Ljava.lang.String"はオブジェクトの配列であることを示します( "L" )クラスjava.lang.Stringの。

プリミティブの配列がある場合、たとえばintの場合、「[I」]になります。他のプリミティブ型は異なる文字を持ちます。

-1

[Ljava.lang.String;

ここで[配列を意味します。 Lはjava.lang.String型のクラスを意味します。これらは、JVMがJavaデータ型を識別するために保持するショートカットです。これは、バイトコードで内部的に使用される型記述子に似ています。たとえば、プリミティブの場合、値は次のようになります。[Iはintの配列、2次元配列は[[I.ここで

は非常に良い説明です:[L array notation - where does it come from?

関連する問題