2011-07-15 36 views
10

Tôi có một câu hỏi đơn giản:Mở rộng giao diện bên trong?

Tại sao Eclipse hét lên về việc triển khai hai giao diện này?

public abstract class Gateway implements IPlayerity, IItemity { 
    public interface IPlayerity { ... } 
    public interface IItemity { ... } 
    // I...ity 
} 

tôi nhận được thông báo lỗi này:

IPlayerity không thể giải quyết cho một loại

+0

lỗi gì bạn nhận được? –

+0

@jason IPlayerity không thể được giải quyết thành một loại. – imacake

Trả lời

4

Bạn có một phụ thuộc tuần hoàn mà không thể giải quyết được theo cách mà JLS hoạt động (mặc dù tôi không chắc chắn vị trí của tài liệu JLS trong tài liệu này).

Giao diện IPlayerity và IItemity không hiển thị với định nghĩa tiêu đề lớp NestedInterfaces, vì chúng nằm bên trong nó. Tôi có thể sửa lỗi này bằng cách thay đổi chương trình của bạn để

public class NestedInterfaces implements 
     NestedInterfaces.IPlayerity, NestedInterfaces.IItemity 
{ 
    public interface IPlayerity {} 
    public interface IItemity {} 
} 

nhưng sau đó Eclipse mang lại cho tôi lỗi này, đó là nhiều rõ ràng hơn:

Multiple markers at this line 
- Cycle detected: the type NestedInterfaces cannot extend/implement itself or one of its own member types 
- Cycle detected: the type NestedInterfaces cannot extend/implement itself or one of its own member types 
+2

Vậy làm thế nào để chúng tôi làm việc xung quanh vấn đề "phát hiện chu trình"? Phát hiện chu kỳ – Pacerier

+0

được giải quyết bằng cách xác định giao diện bên ngoài lớp đang triển khai nó. –

0

tôi thấy rằng hai giao diện này không được mặc định giao diện java, phải không? Vì vậy, nếu bạn nhận được lỗi "IPlayerity không thể được giải quyết cho một loại.", Kiểm tra xem bạn nhập đúng gói chưa. Tôi nên bình luận về điều này, nhưng tôi không thể. Chúc vui vẻ.

5

Khai báo giao diện trong tệp khác. Rõ ràng với tôi rằng một lớp cấp cao nhất không thể thực hiện các giao diện được lồng trong chính nó (mặc dù tôi không chắc chắn tại sao).

Nếu bạn muốn giữ các giao diện trong cùng một tệp, thì bạn phải thay đổi công cụ sửa đổi từ công khai thành mặc định và khai báo chúng sau định nghĩa lớp.

+1

Tôi * nghĩ * lý do là cách tải lớp hoạt động. Các tham chiếu bình thường đến các lớp khác được nạp một cách lười biếng, nhưng các lớp bên ngoài, các siêu lớp và các giao diện được triển khai được nạp tự động trước khi lớp đó được nạp. Khi lớp ngoài của bạn thực hiện một giao diện bên trong và cấu trúc đó sẽ hợp lệ, bạn sẽ nhận được một StackOverflowError trong trình nạp lớp khi nạp lớp vào thời gian chạy ... – mihi

-1

Nếu nó không thể được giải quyết như một loại, sau đó nó không thể được "nhìn thấy". Bạn nên thêm một nhập khẩu đối với giao diện:

import package.Gateway.IPlayerity 
import package.Gateway.IItemity 

vẫn còn, tôi có một cảm giác rằng sau đó trình biên dịch sẽ ném một số lỗi cyclic lạ khác ..

Sẽ tốt hơn nếu bạn định nghĩa các giao diện trong tập tin khác.

+1

Có lỗi cyclic. – sulai

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