2012-04-02 50 views
8

Mã này biên dịch:Loại tham số với nhiều giới hạn

import java.io.Serializable; 
import java.util.Arrays; 
class Test<T extends Arrays & Serializable> { } 

nhưng nếu tôi thay thế các dòng cuối cùng với

class Test<T extends Serializable & Arrays> { } 

tôi nhận được "giao diện dự kiến ​​ở đây". Tại sao?

Trả lời

13

Từ section 4.4 of the JLS:

Mỗi kiểu dữ liệu khai báo là một tham số kiểu có một ràng buộc. Nếu không có ràng buộc nào được khai báo cho một biến kiểu, thì Object được giả định. Nếu một ràng buộc được khai báo, nó bao gồm một trong hai:

  • một loại duy nhất biến T, hoặc

  • một lớp hoặc giao diện kiểu T có thể theo sau bởi các loại giao diện I1 & ... & Trong.

Đây là lỗi thời gian biên dịch nếu có bất kỳ loại I1 nào ... Trong loại biến loại hoặc loại lớp.

Về cơ bản, nếu giới hạn của bạn bao gồm một lớp, thì đó phải là giới hạn trước tiên.

(Cho rằng Arrays không thể được khởi tạo, nó không rõ ràng lý do tại sao bạn sẽ muốn một ràng buộc trong đó có nó, tâm trí bạn ... là này chỉ là một ví dụ?)

+1

«đây chỉ là một ví dụ?» Vâng, đó là :-) Tôi chỉ đang thử nghiệm với các tham số kiểu bị chặn. Cảm ơn bạn vì câu trả lời. – Gmacar

0

Nếu một trong những giới hạn là một lớp, nó phải được xác định trước.

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