2010-07-21 24 views
6

Trong mã của riêng tôi và trên nhiều bài đăng danh sách gửi thư, tôi đã nhận thấy sự nhầm lẫn do Không có nội dung nào được suy ra dưới dạng giới hạn trên ít nhất của hai loại khác.Theo những điều kiện nào được suy ra Không có gì mong muốn?

Câu trả lời chưa rõ ràng để bạn *, nhưng tôi lười biếng, vì vậy tôi yêu cầu bạn *:

  • Theo suy luận những điều kiện nào được Không có gì trong cách này kết quả hấp dẫn nhất?

  • Sẽ có ý nghĩa khi trình biên dịch đưa ra lỗi trong những trường hợp này hoặc cảnh báo trừ khi bị ghi đè bởi một số loại chú thích?

* Số nhiều

Trả lời

2

Không thể suy ra Nothing là giới hạn trên ít nhất của hai loại trừ khi hai loại đó cũng là cả hai Nothing. Khi bạn suy ra giới hạn trên của hai loại, và hai loại không có điểm chung, bạn sẽ nhận được Any (Trong hầu hết các trường hợp như vậy, bạn sẽ nhận được AnyRef mặc dù, vì bạn sẽ chỉ nhận được Any khi một loại giá trị như Int hoặc Long có liên quan.)

+0

Câu trả lời đúng cho câu hỏi chưa rõ ràng của tôi, đủ tốt cho bây giờ. :) –

4

Không có gì là subtype của tất cả mọi thứ, vì vậy nó là trong một nghĩa nào đó phần truy cập của bất kỳ, đó là loại siêu của tất cả mọi thứ. Không có gì không thể được khởi tạo, bạn sẽ không bao giờ giữ một đối tượng Không có gì. Có hai tình huống (tôi biết), nơi Không có gì là thực sự hữu ích:

  • Một chức năng không bao giờ trả (trái ngược với một hàm trả về không hữu ích giá trị, mà sẽ sử dụng đơn vị thay vì), trong đó xảy ra cho các vòng vô hạn, chặn vô hạn, luôn luôn ném ngoại lệ hoặc thoát khỏi ứng dụng
  • Như một cách để chỉ định loại Container trống, ví dụ Không hoặc Không. Trong Java, bạn không thể có một đối tượng Nil đơn lẻ cho một danh sách bất biến chung mà không cần đúc hoặc các thủ thuật khác: Nếu bạn muốn tạo một Danh sách Ngày, ngay cả phần tử trống cần phải có kiểu đúng, phải là một kiểu con của Ngày. Là Ngày và ví dụ: Integer không chia sẻ một subtype phổ biến trong Java, bạn không thể tạo một cá thể Nil như vậy mà không có thủ đoạn, mặc dù Nil của bạn thậm chí không giữ bất kỳ giá trị nào. Bây giờ Scala có loại phụ phổ biến này cho tất cả các đối tượng, vì vậy bạn có thể định nghĩa Nil là object Nil extends List[Nothing] và bạn có thể sử dụng nó để bắt đầu bất kỳ Danh sách nào bạn thích.

Câu hỏi thứ hai của bạn: Có, điều đó sẽ hữu ích. Tôi đoán đã có một trình chuyển đổi trình biên dịch để bật các cảnh báo này, nhưng tôi không chắc chắn.

+0

Cảm ơn, nhưng tôi biết rõ những gì Không có gì tốt cho, trong sự cô lập; Tôi đang cố gắng tìm ra khi nào nó hữu ích cho nó được suy ra bằng thuật toán LUB. –