Tôi đã tìm kiếm rất nhiều, nhưng tôi không tìm thấy gì cả, ý nghĩa của kiểu này là type declaration
trong Scala?Ý nghĩa của>: Null <: trong Scala là gì?
type Ident >: Null <: AnyRef
Tôi đã tìm kiếm rất nhiều, nhưng tôi không tìm thấy gì cả, ý nghĩa của kiểu này là type declaration
trong Scala?Ý nghĩa của>: Null <: trong Scala là gì?
type Ident >: Null <: AnyRef
Từ khóa type
dành cho khai báo bí danh loại, giống như val
và def
là khai báo giá trị và phương thức. Trong trường hợp này, nó là một bí danh kiểu trừu tượng với các ràng buộc, vì vậy nó là một thành viên kiểu của một số trait
hoặc class
- loại bí danh trong phạm vi địa phương không thể trừu tượng và không thể có ràng buộc.
Loại Ident
là loại phụ của AnyRef
và siêu kiểu Null
.
AnyRef
AnyRef
là tổ tiên của tất cả các loại tài liệu tham khảo, tất cả các loại trừ Int
, Long
, Char
và vân vân (Java nguyên thủy).
Null
Null
là subtype của tất cả các loại "nullable". Trên thực tế, đó là một loại phụ của tất cả các loại tham chiếu.
Vì tất cả AnyRef
đều không có ràng buộc bổ sung duy nhất từ >: Null
là Ident
không phải là Nothing
.
Trong trường hợp của bạn Null
là một subtype của Ident
và AnyRef
là siêu kiểu của nó. Trong không có ranh giới này, kiểu con chung của tất cả các loại là Nothing
, nhưng bạn chỉ định nó là Null
, với là một kiểu con của tất cả đối tượng khi Không có gì là kiểu con của mọi thứ (bao gồm Int, Long, v.v.)
Null và Không có gì được sử dụng trong Type System, về cơ bản là loại phương sai (Contra/Co). Ví dụ:
sealed trait Container[+A >: Null <: AnyRef]
case class Full[A >: Null <: AnyRef](value: A) extends Container[A]
case object Empty extends Container[Null]
này trình biên dịch hoàn hảo
val c: Container[String] = Full("String")
val e: Container[String] = Empty
Nhưng điều này thất bại, bởi vì chúng tôi thấp hơn ràng buộc là Null và trên là AnyRef:
val ff: Container[Int] = Full(10)
val f: Container[Int] = Empty
Chúng tôi không thể đặt Int
đây beacuse này loại vi phạm các giới hạn
Để thêm vào câu trả lời @ Senia của: đây không phải là một loại khai, đây là một trừu tượng loại thành viên khai, được tìm thấy trong bối cảnh như
trait Foo { // or perhaps class
type Ident >: Null <: AnyRef
}
và có nghĩa là mọi triển khai cụ thể Foo
phải xác định một số loại là Ident
và loại này phải đáp ứng các ràng buộc được mô tả trong câu trả lời của @ senia.
Vâng, định nghĩa kiểu này nằm trong một đặc điểm – Pooya
Câu hỏi tiếp theo nhanh chóng (vì tôi tò mò), không phải là giới hạn dưới ở đây không cần thiết? Vì 'Null' là kiểu con của tất cả các kiểu tham chiếu và kiểu đã có giới hạn trên được định nghĩa là * bất kỳ kiểu tham chiếu nào *? –
Cảm ơn, tôi biết hệ thống phân cấp, nhưng câu hỏi của tôi là ý nghĩa của lệnh này – Pooya
@ PatrykĆwiek: Tôi đoán vậy. Nhưng kiểu 'Null' có thể được nhắc đến như là cảnh báo rõ ràng rằng giá trị có thể là' null'. – senia