2012-09-18 34 views
6

thể trùng lặp:
@SuppressWarnings for “extends String”Tại sao `T mở rộng chuỗi` được cho phép nhưng đưa ra cảnh báo?

Tại sao T extends String được cho phép nhưng cung cấp cho cảnh báo?

Thông số loại T không được bao bọc bởi chuỗi loại cuối cùng. loại thức không thể được mở rộng hơn nữa

public class Car<T extends String> 

tôi biết những gì là cuối cùng tôi biết Nó có giá trị bởi vì chỉ có giá trị có thể có của T can be String tôi đã tự hỏi về Cảnh báo.

+2

Thông báo cảnh báo cho biết mọi thứ. Làm thế nào bạn có thể đưa ra một lớp mở rộng chuỗi 'final'? Vì vậy, 'T' sẽ dứt khoát là một chuỗi' – Raffaele

+0

@ Thor84no xem câu hỏi đã chỉnh sửa và câu trả lời của [axtavt] (http://stackoverflow.com/a/12475147/315306) ' – Raffaele

Trả lời

13

Nếu câu hỏi thực tế là "tại sao câu hỏi được phép", thì hãy tưởng tượng một tình huống khi bạn thêm final từ khóa vào lớp hiện tại. Tôi nghĩ rằng bạn không muốn thay đổi này để phá vỡ mã hiện có khác sử dụng lớp này như là một ràng buộc chung chung, bởi vì nó vẫn hoàn toàn hợp pháp. Đó là lý do tại sao trình biên dịch không phát ra lỗi trong trường hợp này.

Từ phía bên kia, bạn muốn được thông báo nếu bạn tình cờ sử dụng final lớp dưới dạng giới hạn chung, bởi vì một cấu thành như vậy không có ý nghĩa. Đó là lý do tại sao trình biên dịch phát ra cảnh báo.

Thực ra, thực tiễn phổ biến là đánh dấu các cấu trúc hợp pháp nhưng vô nghĩa với cảnh báo.

1

Bởi vì String trong java là cuối cùng, i. e. bạn không thể mở rộng lớp đó. Vì vậy, bạn có cảnh báo vì không thể tồn tại một lớp mở rộng chuỗi.

+2

OP đang hỏi tại sao nó được phép làm ? –

3

Về cơ bản, người ta nói rằng chỉ có một loại có thể cho T và đó là chính mình là String. Vì vậy, về cơ bản lớp chung của bạn Car chỉ có tên chung. Bạn cũng có thể thay thế tất cả các phiên bản của T trong lớp học với String.

Có lẽ bạn có nghĩa là public class Car<T extends CharSequence> ...


Các cấu trúc được phép bởi vì lớp có ý nghĩa, và thậm chí có thể hữu ích. Các cảnh báo được đưa ra bởi vì (theo ý kiến ​​của các nhà văn biên dịch), bạn có thể đã làm sai. Lý do là giống như đối với cảnh báo rằng một số trình biên dịch sẽ cung cấp cho bạn những điều sau đây:

String NULL = null; 
System.err.println(NULL.toString()); 

Đây là ý nghĩa, nhưng nó là một sai lầm ... trừ khi bạn có ý định nó để ném một ngoại lệ.


tôi có thể nghĩ đến hai kịch bản mà public class Car<T extends SomeFinalClass> không phải là một sai lầm:

  • Các trường hợp SomeFinalClass ban đầu là không final.
  • Trường hợp mã cho Car được tạo tự động và sẽ rất khó khăn khi tạo mã trường hợp đặc biệt cho các lớp final.
Các vấn đề liên quan