การสร้าง ArrayList ใหม่

ฉันมีคำถามเกี่ยวกับการสร้างรายการอาร์เรย์ใหม่

ถ้าฉันสร้างอันใหม่ด้วย

ArrayList <?> listtwo = new ArrayList<?>();

ฉันจะใส่อะไรลงในอาร์เรย์ได้บ้าง? ฉันสามารถใส่ Strings และ Integers ลงไปได้หรือไม่? หรือวิธีนี้ทำงานอย่างไร

ฉันรู้ว่าถ้าคุณสร้างรายการเช่น:

ArrayList<String> list =new ArrayList<String>(); 

ที่คุณสามารถใส่ได้เพียง Strings เท่านั้น และถ้าคุณพยายามทำอย่างอื่น มันจะทำให้เกิดข้อยกเว้นในการคอมไพล์


person user3807485    schedule 05.07.2014    source แหล่งที่มา
comment
คุณสามารถใส่ค่าสตริงใน ArrayList‹String› และถ้าคุณต้องการใส่ค่าอื่น ๆ คุณต้องแปลงมันเป็นสตริง!   -  person Mohsen fallahi    schedule 05.07.2014
comment
ฉันรู้ว่าคุณทำได้ใน ArrayList‹string› แต่คำถามของฉันคือ ฉันจะใส่อะไรลงใน Arraylist‹ ได้บ้าง›   -  person user3807485    schedule 05.07.2014
comment
List<?> เนื่องจากอินเทอร์เฟซค่อนข้างย่อมาจากขอบเขตของ List<? extends Object> ไม่จำกัดอะไรมากจริงๆ   -  person EpicPandaForce    schedule 05.07.2014
comment
ฉันโพสต์ข้อมูลบางอย่างเกี่ยวกับยาสามัญที่นี่: stackoverflow.com/questions/24574478/   -  person EpicPandaForce    schedule 05.07.2014


คำตอบ (2)


มีสองประเด็นที่นี่

(a) new ArrayList<?> ไม่ใช่การแสดงออกทางกฎหมาย

หากคุณต้องการสร้างรายการที่สามารถเก็บ String และ Integers คุณต้องใช้ ArrayList<Object> เนื่องจาก Object เป็น super-type ทั่วไป (เฉพาะเจาะจงที่สุด) ของ String และ Integer:

ArrayList<Object> list = new ArrayList<Object>;
list.add('abcd'); // insert a string
list.add(1234); // insert an integer

ข้อเสียคือเมื่อคุณแตกรายการออกจากรายการนี้ รายการนั้นจะเป็นประเภท Object ดังนั้นคุณจะต้องดาวน์แคสต์รายการนั้น:

String s = (String) list.get(0);
Integer n = (Integet) list.get(1);

(b) เกี่ยวกับสัญลักษณ์ตัวแทน ?:

สามารถใช้เพื่อระบุประเภทของตัวแปรได้ เช่น ArrayList<?> list = ... แต่ไม่สามารถใช้ในนิพจน์ new ได้ กล่าวอีกนัยหนึ่ง สำนวนนี้ผิดกฎหมาย: new ArrayList<?>

ไวด์การ์ดมีประโยชน์ในการอนุญาต (จำกัด) ความหลากหลายระหว่างรายการ โดยเฉพาะอย่างยิ่ง หากคุณมีรายการ Integers และคุณต้องการปฏิบัติเหมือนรายการ Number (ซึ่งสมเหตุสมผลเนื่องจาก Integer เป็นคลาสย่อยของ Number) คุณสามารถใช้สัญลักษณ์ตัวแทนได้

ArrayList<Integer> list2 = new ArrayList<Integer>();
list2.add(100);
list2.add(200);

// This assignment is OK:
ArrayList<? extends Number> list3 = list2;   
Number n = list3.get(0); // n is now 100

อย่างไรก็ตาม ปัญหาของ list3 (หรือรายการอื่นที่มีประเภทไวด์การ์ด) คือคุณไม่สามารถเปลี่ยนรูปแบบได้ ตัวอย่างเช่น หากคุณพยายามเพิ่มองค์ประกอบลงในรายการนี้:

list3.add(300); // <-- This is not allowed

คุณจะได้รับข้อผิดพลาดในการคอมไพล์เวลา

person Itay Maman    schedule 05.07.2014

ถ้าฉันสร้างอันใหม่ด้วย

ArrayList <?> listtwo = new ArrayList<?>();

คุณไม่สามารถ. คุณไม่สามารถสร้างอินสแตนซ์ประเภทที่กำหนดพารามิเตอร์โดยไม่มีขอบเขตได้ นี่คือสิ่งที่คอมไพเลอร์จะพูด:

      ArrayList <?> listtwo = new ArrayList<?>();
                                           ^
  required: class or interface without bounds
  found:    ?

ดังนั้นคำถามเกี่ยวกับสิ่งที่คุณสามารถใส่ลงไปได้นั้นเป็นเรื่องที่สงสัย

หากคุณไม่ได้ระบุพารามิเตอร์ type เลย:

ArrayList listtwo = new ArrayList();

...คุณสามารถใส่อะไรก็ได้ที่คุณชอบลงไป (รวมถึงของต่างๆ ด้วย) ค่าดั้งเดิมจะถูกบังคับให้เทียบเท่ากับวัตถุ (int =› Integer ฯลฯ) ณ จุดนั้น โดยพื้นฐานแล้วมันคือ ArrayList<Object> อินสแตนซ์

person T.J. Crowder    schedule 05.07.2014
comment
ขอบคุณ ฉันสับสนเกี่ยวกับเรื่องนี้! - person user3807485; 05.07.2014