2013-08-05 55 views

Trả lời

12

Từ khóa type dành cho khai báo bí danh loại, giống như valdef 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ừ ​​>: NullIdent không phải là Nothing.

Xem Scala’s type hierarchy:

Scala’s type hierarchy

+0

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 *? –

+0

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

+1

@ 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

1

Trong trường hợp của bạn Null là một subtype của IdentAnyRef 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

7

Để 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.

+0

Vâng, định nghĩa kiểu này nằm trong một đặc điểm – Pooya

Các vấn đề liên quan