2010-01-23 49 views
15

Trong Scala, những gì hiện"Đặc điểm A <: B" có nghĩa là gì?

trait A <: B 

nghĩa là gì? Có phải chỉ giống như

trait A extends B 

?

Chỉnh sửa để thêm: Tôi quen thuộc với cú pháp cho các thông số loại và những gì <: có nghĩa là trong ngữ cảnh đó. Tuy nhiên, trong ví dụ trên có vẻ như với tôi rằng A là tên của đặc điểm được khai báo, không phải là một tham số kiểu.

+28

Tôi nghĩ điều đó có nghĩa là B đang mỉm cười tại A –

+1

FWIW, bản cài đặt 2.7.5 của tôi không cho phép. –

+0

Tôi đang sử dụng ảnh chụp nhanh 2.8 (2.8.0.r20331-b20100101020206) –

Trả lời

17

vẻ để biên dịch để điều tương tự.

~/code/scratch: scala -Xprint:typer -e 'trait B; trait A <: B' 
      // snip 
      abstract trait B extends scala.AnyRef; 
      abstract trait A extends java.lang.Object with this.B 

~/code/scratch: scala -Xprint:typer -e 'trait B; trait A extends B' 
      // snip 
      abstract trait B extends scala.AnyRef; 
      abstract trait A extends java.lang.Object with this.B  

Thông số kỹ thuật không giải thích điều này trong "5.3.3 Đặc điểm". Nhưng Tóm tắt cú pháp không đề cập đến điều này.

TraitDef ::= id [TypeParamClause] TraitTemplateOpt 
TraitTemplateOpt ::= Extends TraitTemplate | [[Extends] TemplateBody] 
Extends ::= ‘extends’ | ‘<:’ 

CẬP NHẬT Nó được giới thiệu vào r14632. Với tùy chọn biên dịch -Xexperimental, nó đánh dấu đặc điểm là trừu tượng, để sử dụng với tính năng ngôn ngữ được đề xuất Virtual Traits. Không có -Xexperimental, nó là một từ đồng nghĩa cho 'mở rộng' chỉ được phép cho các đặc điểm.

+5

Phụ thuộc vào phần thông số bạn xem! Phụ lục tóm tắt cú pháp nói, "Mở rộng :: = 'mở rộng' | '<:'" –

+0

Tôi nêu ra một lỗi về thông số: https://lampsvn.epfl.ch/trac/scala/ticket/2953 – retronym

+0

Xem thêm http : //lampsvn.epfl.ch/trac/scala/export/20327/scala/branches/devel-base-2.8.0/SIP/virtual-traits/sip-0000X.xhtml –

3

Có, tốt, hầu như, xem để biết thêm thông tin. Từ số language spec, chúng tôi thấy định nghĩa sau:

Chúng tôi xác định hai mối quan hệ giữa các loại.

Loại tương đương T ≡ U T và U có thể hoán đổi cho nhau trong mọi ngữ cảnh.

Tuân thủ T <: U Kiểu T phù hợp với loại U.

Sửa: Nhìn vào spec ngôn ngữ dường như <:extends đều giống nhau, đặc biệt là nó được định nghĩa là:

ClassTemplateOpt ::= Extends ClassTemplate | [[Extends] TemplateBody] 
TraitTemplateOpt ::= Extends TraitTemplate | [[Extends] TemplateBody] 
Extends ::= ‘extends’ | ‘<:’ 
3

Nhìn vào Scala Language Specification, có vẻ như cũng giống như vậy. Mô tả cho đặc điểm chỉ đề cập đến cú pháp trait A extends B. Nhưng tóm tắt cú pháp Scala sử dụng extends<: thay thế cho nhau để định nghĩa đặc điểm:

TraitTemplateOpt ::= Extends TraitTemplate | [[Extends] TemplateBody] 
Extends ::= ‘extends’ | ‘<:’ 
11

Các <: cú pháp được dành riêng cho sử dụng sau này trong các lớp học ảo (được chưa được thực hiện).

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