อะไรคือความแตกต่างระหว่าง '&' และ ',' ใน Java generics?


110

ในขณะที่อ่านบทช่วยสอนอย่างเป็นทางการของ Java เกี่ยวกับ generics ฉันพบว่าคุณสามารถ จำกัด อาร์กิวเมนต์ type (ในกรณีนี้คือT) เพื่อขยายคลาสและ / หรืออินเทอร์เฟซเพิ่มเติมด้วยตัวดำเนินการ 'และ' ( &) ดังนี้:

<T extends MyClass & Serializable>

ฉันแทนที่&ด้วย,(โดยไม่ได้ตั้งใจและยังใช้งานได้พร้อมคำเตือนเล็กน้อย)

คำถามของฉันคือมีความแตกต่างระหว่างสองสิ่งนี้หรือไม่:

<T extends MyClass & Serializable>
<T extends MyClass , Serializable> // here is with comma

และวิธีการตัวอย่าง:

static <T extends MyClass & Serializable> ArrayList<T> fromArrayToCollection(T[] a) {
    ArrayList<T> arr = new ArrayList<T>();

    for (T o : a) {
        arr.add(o); // Correct
    }
    return arr;
}

5
@ Doorknob คุณสมมติว่า OP ใช้แป้นพิมพ์และแป้นพิมพ์เดียวกับที่คุณใช้
emory

3
@emory ฉันคิดว่ามันผิดทิศทาง - ข้อผิดพลาดไม่ได้อยู่ที่นิ้วของเขา แต่อยู่ในสมองของเขา เหมือนกับว่าคุณพยายามใช้ "รวม" แทน "นำเข้า" ในไฟล์ต้นฉบับ Java คุณพิมพ์คำว่า "รวม" ผิดเพราะสมองของคุณบอกให้คุณพิมพ์สิ่งที่ผิดซึ่งเป็นไปได้จากหลายสาเหตุ
Nick Pickering

2
@Nicholas Pickering ใช่แล้ว! สำหรับฉันมันไม่ใช่การพิมพ์ผิดเพราะคีย์บอร์ด แต่เป็นเพราะสมอง เมื่อคุณเขียนว่าอินเทอร์เฟซใดที่คลาสใช้งานคุณจะคั่นด้วยเครื่องหมายจุลภาค
Alin Ciocan

คำตอบ:


169
<T extends MyClass & Serializable>

นี้อ้างว่าพารามิเตอร์ชนิดเดียวTต้องขยายและต้องเป็นMyClassSerializable

<T extends MyClass , Serializable>

สิ่งนี้ประกาศพารามิเตอร์สองประเภทตัวหนึ่งเรียกว่าT(ซึ่งต้องขยายMyClass) และอีกตัวเรียกว่าSerializable(ซึ่งซ่อนjava.io.Serializable- นี่อาจเป็นคำเตือนเกี่ยวกับ)

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