Bạn là chính xác; new
không bắt buộc. Họ có thể đã xác định phương pháp dụ List#::
như thế này chỉ là tốt:
def ::[U >: T](x: U): List[U] = scala.::(x, this)
(Lưu ý rằng chúng ta có:
type :: = collection.immutable.::
val :: = collection.immutable.::
quy định tại đối tượng scala
gói; là người đầu tiên là tại sao new scala.::(x, this)
tác phẩm của mình, và thứ hai là lý do tại sao công cụ scala.::(x, this)
của tôi hoạt động.)
The form the library uses gọi trực tiếp cho nhà xây dựng, như của bạn. Phương thức thay thế gọi phương thức apply
của đối tượng đồng hành tổng hợp được tạo cho lớp trường hợp ::
, mà chỉ đơn giản gọi hàm tạo. Có lẽ gọi nhà xây dựng được coi là rõ ràng hơn, hoặc hiệu quả hơn? (. Tăng hiệu quả nên được gần gũi với không có gì, tuy nhiên, vì nếu trình biên dịch không nội tuyến cuộc gọi đến apply
, JVM sẽ) Tôi cho rằng các hình thức nhỏ gọn nhất:
def ::[U >: T](x: U) = ::(x, this)
có thể bị nhầm lẫn với một số lập dị (Ví dụ, không thể) loại lời gọi đệ quy, và ở bất kỳ tỷ lệ nào làm mờ sự khác biệt giữa các lớp được gọi là ::
và phương pháp List
được gọi là ::
, mà Giáo sư Odersky chịu đựng để giữ riêng biệt nhằm tối đa hóa khả năng đọc của người đọc.
Hy vọng điều này sẽ hữu ích.
cuối cùng chỉ có nghĩa là lớp không thể được mở rộng, nó không có gì để làm với tạo ví dụ :-). Trường hợp lớp cơ bản là một lớp có thể được so sánh trong một khối 'trường hợp phù hợp'. – aishwarya