2012-01-07 37 views
8

Với đoạn mã sau:Tại sao việc ghi đè loại trừu tượng đã triển khai không thể thực hiện được?

class A { 

    class B 

    type C <: B 

    trait D 

} 

class E extends A { 

    type C = B 

} 

class F extends E { 

    override type C = B with D 

} 

Tại sao biên dịch trình bày Scala IDE trong Eclipse Indigo IDE phàn nàn với thông báo lỗi trọng loại C trong lớp E, bằng F.this.B; loại C có loại không tương thích?

Sau khi tất cả các lớp "B" chỉ được "sửa đổi" với đặc điểm "D" và do đó hai định nghĩa loại có cùng loại cơ sở, là "B". Do đó định nghĩa kiểu tương thích.

Mã bên dưới hoạt động. Tôi xem xét các quy tắc về phân công loại tương tự như chuyển nhượng biến, chẳng hạn như:

class Foo 

trait Bar 

val a: Foo = new Foo 

val fooWithBar: Foo = new Foo with Bar 

Tôi hiểu sai?

+1

Foo with Bar là một loại phụ của Foo. Đây không phải là vấn đề. Bạn không được phép xác định lại một thành viên loại trong khi nó được sửa, ngay cả với một kiểu con. Nếu bạn có lớp Bar mở rộng Foo, bạn cũng không thể định nghĩa lại thành viên kiểu từ Foo thành Bar. –

Trả lời

13

Họ không tương thích, loại C có thể được sử dụng ở một vị trí contravariant

class E extends A { 
    type C = B 
    def f(c: C) 
} 


class F extends E { 
    override type C = B with D 
    def f(c: ???) 
} 

Complement cho e: E, bạn được phép gọi e.f(new B). Điều gì xảy ra nếu eval e = new F?

+0

Tại sao chòm sao này không bị giới hạn miễn là loại được ghi đè "C" bị hạn chế hơn nữa và giữ loại cơ sở "B". Nếu phương thức "f" chấp nhận "B" thì tại sao nó không chấp nhận các lớp con ở đây, theo định nghĩa lại "B với D"? –

+3

Nếu phương thức chấp nhận B, chắc chắn nó phải chấp nhận các kiểu con. Vấn đề là trường hợp của F sẽ yêu cầu B với D, và vì vậy không còn chấp nhận đơn giản B. Một loại phụ của E phải chấp nhận B trong f. Tất nhiên nó sẽ chấp nhận các kiểu con. Nó không thể yêu cầu đối số là một kiểu con. –

+0

Tôi không chắc đây là ví dụ truy cập chính xác. Đây là lý do tại sao: (xin lỗi, bỏ qua, tôi đã cố gắng để hủy bỏ trên điện thoại của tôi, nhưng nó đã được đăng thay vào đó ..) –

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