1. ホーム
  2. java

[解決済み] なんだこれ。[Ljava.lang.Object;?

2022-05-18 10:43:51

質問

を呼び出すと、次のようなメッセージが表示されます。 toString を呼び出したときに表示されます。オブジェクトの型がこの文字列にエンコードされていることは分かっているのですが、それを読み取る方法が分かりません。

このタイプのエンコーディングは何と呼ばれていますか?

どのように解決するのですか?

[Ljava.lang.Object;Object[].class は、その java.lang.Class の配列のクラスを表す Object .

命名規則については Class.getName() :

このクラスオブジェクトが配列型ではない参照型を表す場合、Java 言語仕様で規定されているように、クラスのバイナリ名が返されます ( §13.1 ).

このクラスオブジェクトがプリミティブ型を表している場合、または void を表している場合、返される名前はプリミティブ型に対応する Java 言語のキーワード、または void .

このクラスオブジェクトが配列のクラスを表す場合、名前の内部形式は、要素のタイプの名前の前に1つ以上の '[' 文字で表されます。 要素タイプ名のエンコーディングは以下の通りです。

Element Type        Encoding
boolean             Z
byte                B
char                C
double              D
float               F
int                 I
long                J
short               S 
class or interface  Lclassname;

あなたのものは、そのリストの最後のものです。 以下はその例です。

// xxxxx varies
System.out.println(new int[0][0][7]); // [[[I@xxxxx
System.out.println(new String[4][2]); // [[Ljava.lang.String;@xxxxx
System.out.println(new boolean[256]); // [Z@xxxxx

の理由は toString() メソッドが配列に対して String をこの形式で返すのは、配列が @Override から継承されたメソッドは Object であり、以下のように指定されます。

toString クラスのメソッド Object は、オブジェクトのインスタンスであるクラスの名前、アットマーク文字 `@' およびオブジェクトのハッシュコードの符号なし16進数表現からなる文字列を返します。つまり、このメソッドは以下の値に等しい文字列を返す。

getClass().getName() + '@' + Integer.toHexString(hashCode())

ノート に依存することはできません。 toString() は、任意のオブジェクトが上記の仕様に従うことを当てにすることはできません。 @Override を返すことができるからです。任意のオブジェクトの型を調べるのにより確実な方法は getClass() を呼び出すことです (a final から継承されたメソッドです。 Object を継承している)、そして を反映した を返します。 Class オブジェクトに反映させることができます。しかし理想的には、リフレクションが必要ないようにAPIが設計されているべきです ( Effective Java 2nd Edition, Item 53: Prefer interfaces to reflection ).


もっと "役に立つ" で。 toString 配列の場合

java.util.Arrays が提供する toString プリミティブ配列のオーバーロードと Object[] . また deepToString もあり、これはネストされた配列に使いたいかもしれません。

以下はその例です。

int[] nums = { 1, 2, 3 };

System.out.println(nums);
// [I@xxxxx

System.out.println(Arrays.toString(nums));
// [1, 2, 3]

int[][] table = {
        { 1, },
        { 2, 3, },
        { 4, 5, 6, },
};

System.out.println(Arrays.toString(table));
// [[I@xxxxx, [I@yyyyy, [I@zzzzz]

System.out.println(Arrays.deepToString(table));
// [[1], [2, 3], [4, 5, 6]]

また Arrays.equalsArrays.deepEquals など、配列に関連する多くのユーティリティメソッドの中で、その要素によって配列の等価比較を実行するものです。

関連する質問