2013-08-22 55 views
108

Khi đọc hướng dẫn chính thức Java về generics, tôi thấy rằng bạn có thể giới hạn đối số kiểu (trong trường hợp này là T) để mở rộng lớp và/hoặc nhiều giao diện với toán tử 'và' (&) như sau:Sự khác biệt giữa '&' và ',' trong Generics Java là gì?

<T extends MyClass & Serializable> 

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

Câu hỏi của tôi là, liệu có bất kỳ sự khác biệt giữa hai:

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

Và phương pháp 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 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 - nhưng lỗi không nằm trong ngón tay anh mà là trong não anh. Tương tự như thể bạn đã cố gắng sử dụng 'include' thay vì 'import' trong một tệp nguồn Java. Bạn gõ nhầm 'bao gồm', bởi vì bộ não của bạn nói với bạn để gõ sai điều, có thể vì nhiều lý do. –

+2

@Nicholas Pickering, là đúng! Đối với tôi, nó không phải là một loại nhầm lẫn vì bàn phím, mà là vì bộ não. Khi bạn viết các giao diện mà một lớp thực hiện, bạn tách chúng bằng dấu phẩy. –

Trả lời

166
<T extends MyClass & Serializable> 

này khẳng định rằng các tham số kiểu đơn T phải mở rộng MyClass và phải là Serializable.

<T extends MyClass , Serializable> 

này tuyên bố hai tham số kiểu, một gọi là T (mà phải mở rộng MyClass) và một gọi là Serializable (mà giấu java.io.Serializable - đây có lẽ là những gì các cảnh báo đã về).

Các vấn đề liên quan