2011-11-13 33 views
26

Tôi có một lớp Java mà tôi đã chuyển sang Scala, nhưng vẫn có một số lớp con Java triển khai chức năng trừu tượng.Tôi có thể tạo phương thức có quyền truy cập Java được bảo vệ trong Scala không?

Java ban đầu có

public abstract class Base { 
    ... 
    protected abstract Foo getFoo(); 
} 

mà đã được mở rộng

public class Fred extends Base { 
    ... 
    protected Foo getFoo() { 
     return foo; 
    } 
} 

Bây giờ khi tôi cổng cơ sở để Scala

class Base { 
    ... 
    protected def getFoo(): Foo 
} 

Trình biên dịch phàn nàn rằng

Không thể làm giảm tầm nhìn của các phương pháp di truyền ...


Bây giờ tôi hiểu rằng vì quy tắc của nó là tinh tế khác nhau, Scala có xu hướng để thực thi tầm nhìn trong trình biên dịch chứ không phải là bytecode, do đó getFoo là đánh dấu công khai trong lớp javap'd. Nhưng

protected[packagename] def getFoo() 

vẫn không tạo phương pháp bảo vệ pukka (Java) mặc dù tôi cho rằng mức hiển thị phải giống nhau.

Có cách nào để thuyết phục trình biên dịch Scala phát ra một phương thức mà Java sẽ xem xét được bảo vệ không?

+0

Tôi sẽ chấp nhận một quyền 'No' –

+0

Câu hỏi hay. Tôi đã đi theo con đường chính xác trước khi đến trang này. – ebruchez

Trả lời

2

Nếu bạn có thể Scala bánh sandwich giữa hai Java hiện thực, bạn có thể tạo một lớp cha Java chỉ có phương pháp mong muốn bảo vệ trừu tượng, ít nhất là cho đến khi bạn chuyển đổi tất cả các lớp con để Scala (nếu điều này thực sự là mã theo của bạn điều khiển). Nhưng tôi hy vọng có một cách tốt hơn ...

EDIT: Một tùy chọn khác là sử dụng một số loại viết tắt bytecode, như annotation processing tool.

+3

Đó là một kế hoạch đáng khinh, nhưng tốt nhất tôi đã thấy! Trên thực tế các lớp con dưới sự kiểm soát của tôi, vì vậy tôi chỉ có thể thay đổi việc triển khai getFoo thành công khai, nhưng điều này dường như là một câu hỏi thú vị. –

+0

@DuncanMcGregor: vâng, tôi biết. Đã thêm tùy chọn khác ... –

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