Dựa trên câu trả lời cho this question, có vẻ như việc đặt "forSome" sau một thành phần của định nghĩa loại khác với đặt nó ở cuối toàn bộ điều. Ví dụ, có vẻ như có sự khác biệt giữa những điều sau đây:Điều gì quan trọng trong việc sắp xếp mệnh đề "forSome" trong cú pháp Generics Generale?
def one: Foo[U >: T] forSome {type U >: T}
def one: Foo[U forSome {type U >: T}]
Đặc tả ngôn ngữ Scala dường như không nói bất cứ điều gì về sự khác biệt, và tôi có thể tưởng tượng rằng việc di chuyển quantifiers ra bên ngoài sẽ làm cho có sự khác biệt . Nếu nó tạo ra sự khác biệt, tôi đã nghĩ nó sẽ được mô tả trong this answer, về cơ bản nói Set [X forSome {type X}] cho phép X thay đổi giữa các phần tử thiết lập, trong đó Set [X] forSome {type X} không phải. Tuy nhiên, điều này dường như không phải là toàn bộ câu chuyện và/hoặc là không đúng, bởi vì đây không biên dịch:
trait Bar {
def test: Set[X] forSome {type X}
}
def test(b: Bar) {
val set = b.test
val h = set.head
set.contains(h)
}
Nhưng điều này không:
trait Bar {
def test: Set[X forSome {type X}]
}
def test(b: Bar) {
val set = b.test
val h = set.head
set.contains(h)
}
Dường như nếu Set [X] forSome {type X} tạo ra một kiểu trừu tượng riêng cho mỗi trang sử dụng trong lớp instantiated, trong đó Set [X forSome {type X}] chỉ tạo một kiểu và sử dụng nó cho toàn bộ lớp. Điều này trái ngược với những gì tôi mong đợi và có vẻ không phù hợp với câu trả lời ở trên.
Điều này sẽ làm rõ tình huống ít nhất một chút http://stackoverflow.com/questions/21226004/what-is-and-when-to-use-scalas-forsome-keyword – Andrey
@Andrey - Điều đó thật thú vị, đặc biệt bởi vì câu trả lời được chấp nhận cho câu hỏi ngụ ý rằng ngữ nghĩa ngược lại với những gì tôi nghĩ tôi đang thấy. –
@Andrey - thực sự tôi sẽ đi xa hơn một chút và nói rằng câu trả lời được chấp nhận cho câu hỏi đó không hữu ích như một câu trả lời cho câu hỏi này và có thể không đúng. Xem ví dụ sửa đổi của tôi ở trên. –