Sự khác biệt giữa '&' và ',' trong Java generic là gì?


110

Trong khi đọc hướng dẫn chính thức của Java về generics, tôi thấy rằng bạn có thể hạn chế đối số kiểu (trong trường hợp này là T) để mở rộng một lớp và / hoặc nhiều giao diện hơn với toán tử 'và' ( &) như sau:

<T extends MyClass & Serializable>

Tôi đã thay thế &bằng, (do nhầm lẫn và vẫn hoạt động, với một cảnh báo nhỏ).

Câu hỏi của tôi là, có sự khác biệt nào giữa hai điều này:

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

Và phương pháp ví dụ:

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 bạn đang giả sử OP đang sử dụng bàn phím và bàn phím giống như bạn đang sử dụng.
emory

3
@emory Tôi nghĩ ngay cả điều đó cũng sai hướng - lỗi không phải ở ngón tay mà ở bộ não của anh ấy. Tương tự như thể bạn đã cố gắng sử dụng 'bao gồm' thay vì 'nhập' trong tệp nguồn Java. Bạn đã gõ nhầm 'bao gồm', bởi vì não của bạn bảo bạn nhập sai, có thể vì nhiều lý do.
Nick Pickering

2
@Nicholas Pickering, là đúng! Đối với tôi, đó không phải là gõ nhầm do bàn phím, mà là do bộ não. Khi bạn viết các giao diện mà một lớp triển khai, bạn phân tách chúng bằng dấu phẩy.
Alin Ciocan

Câu trả lời:


169
<T extends MyClass & Serializable>

Điều này khẳng định rằng tham số kiểu đơn Tphải mở rộng MyClassvà phải là Serializable.

<T extends MyClass , Serializable>

Điều này khai báo hai tham số kiểu, một được gọi T(phải mở rộng MyClass) và một được gọi Serializable(ẩn java.io.Serializable- đây có thể là cảnh báo nói về).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.