นี่คืออะไร: [Ljava.lang.Object;?


110

ฉันได้รับสิ่งนี้เมื่อฉันเรียกtoStringวัตถุที่ได้รับจากการเรียกใช้ฟังก์ชัน ฉันรู้ว่าประเภทของวัตถุถูกเข้ารหัสในสตริงนี้ แต่ฉันไม่รู้วิธีอ่าน

การเข้ารหัสประเภทนี้เรียกว่าอะไร?

คำตอบ:


211

[Ljava.lang.Object;เป็นชื่อObject[].classที่เป็นตัวแทนระดับของอาร์เรย์ของjava.lang.ClassObject

รูปแบบการตั้งชื่อมีการบันทึกไว้ในClass.getName():

ถ้าคลาสออบเจ็กต์นี้แสดงถึงชนิดการอ้างอิงที่ไม่ใช่ประเภทอาร์เรย์ชื่อไบนารีของคลาสจะถูกส่งกลับตามที่ระบุโดยข้อกำหนดภาษา Java ( §13.1 )

ถ้าวัตถุชั้นนี้หมายถึงชนิดดั้งเดิมหรือvoidแล้วชื่อกลับเป็นภาษา Java voidคำหลักที่สอดคล้องกับประเภทดั้งเดิมหรือ

ถ้าคลาสออบเจ็กต์นี้แสดงถึงคลาสของอาร์เรย์รูปแบบภายในของชื่อจะประกอบด้วยชื่อของประเภทองค์ประกอบที่นำหน้าด้วย'['อักขระอย่างน้อยหนึ่งตัวที่แสดงความลึกของอาร์เรย์ที่ซ้อนกัน การเข้ารหัสชื่อประเภทองค์ประกอบมีดังนี้:

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ส่งกลับสตริงประกอบด้วยชื่อของคลาสซึ่งวัตถุที่เป็นเช่นที่ป้ายตัวอักษร `@' และการแสดงที่ไม่ได้ลงชื่อเลขฐานสิบหกรหัสกัญชาของวัตถุ กล่าวอีกนัยหนึ่งวิธีนี้จะส่งคืนสตริงที่เท่ากับค่าของ:

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

หมายเหตุ : คุณไม่สามารถพึ่งพาtoString()วัตถุตามอำเภอใจใด ๆ เพื่อทำตามข้อกำหนดข้างต้นเนื่องจากสามารถ (และโดยปกติจะทำ)@Overrideเพื่อส่งคืนสิ่งอื่น วิธีที่เชื่อถือได้มากขึ้นในการตรวจสอบประเภทของวัตถุโดยพลการคือการเรียกใช้getClass()(finalวิธีการที่สืบทอดมาObject) จากนั้นสะท้อนไปที่Classวัตถุที่ส่งคืน ตามหลักการแล้ว API ควรได้รับการออกแบบมาเพื่อให้ไม่จำเป็นต้องมีการสะท้อนกลับ (ดู Effective Java 2nd Edition, Item 53: ชอบอินเทอร์เฟซสำหรับการสะท้อนแสง )


"มีประโยชน์" มากกว่า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.equalsและArrays.deepEqualsทำการเปรียบเทียบความเท่าเทียมกันของอาร์เรย์โดยองค์ประกอบของพวกมันรวมถึงวิธียูทิลิตี้อื่น ๆ ที่เกี่ยวข้องกับอาร์เรย์

คำถามที่เกี่ยวข้อง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.