2016-03-25 16 views

Trả lời

13

Điều này là do bạn không xác định loại chung loại T là gì. Vì vậy, theo mặc định nó sẽ nghĩ rằng T là một loại đối tượng, không phải là một số. Nó không thể để một đối tượng đến một đôi, điều này không có ý nghĩa.

Nếu bạn thay đổi thành <T extends Number> việc này sẽ chỉ hoạt động tốt. Mặc dù, bạn có thể cần phải có một mảng Integer thay vì một mảng int

+0

Nếu mảng đã cho là int [] chứ không phải là số nguyên [], có cách nào để làm cho nó hoạt động không? – xmllmx

+0

Tuyệt vời đề cập rằng '' sẽ hoạt động; 1 từ tôi –

+8

@xmllmx Nó sẽ không hoạt động vì 'int' là kiểu nguyên thủy không phải là kiểu đối tượng. – Satya

-2

Trình biên dịch Java sẽ xóa tất cả các tham số kiểu trong mã chung. Hậu quả trực tiếp của việc này là bạn không thể xác minh loại tham số nào cho một generic được sử dụng. Nếu bạn kiểm tra, instanceof cũng sẽ không hoạt động. Vì, thời gian chạy không theo dõi các tham số kiểu trong java, không có sự khác biệt giữa và HashSet<Double>. Bạn có thể thực hiện một số ..instanceof HashSet<?> nhiều nhất để kiểm tra xem đó có phải là một phiên bản của HashSet hay không.

Nếu có điều gì đó không rõ ràng trong những gì tôi đã viết, vui lòng tham khảo docs.

+1

Câu trả lời này là chính xác, nhưng tôi không thấy rằng nó trả lời câu hỏi. –

15

Sự cố sâu hơn vấn đề này. Ngay cả khi không có dòng bạn đánh dấu, chương trình này bị hỏng:

public class Main { 
    public static <T> void foo(T[] bar) { 
     // do nothing 
    } 

    public static void main(String[] args) { 
     int[] int_buf = new int[8]; 
     foo(int_buf); <-- problem is here 
    } 
} 

Java generics chỉ hỗ trợ các loại tham chiếu làm thông số loại; phương pháp foo generic() có thể được viết lại như sau:

<T extends Object> void foo(T[] bar) { ... } 

Và đây là vấn đề của bạn: không có T kéo dài Object như vậy mà một int[] là một T[].

Thứ hai, lý do chuyển đổi cũng không thành công là chúng tôi không biết gì về T, vì vậy chúng tôi không biết rằng có một chuyển đổi từ T đến double.

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