2012-12-11 23 views
5

Tôi có một giao diện như thế này:Generics Java: tại sao giao diện bên trong không thể thực hiện từ một siêu bên trong (inner)?

public interface SuperInterface { 
    public interface SubInterface { 
     public void get(); 
    } 
    //**More interfaces*/ 

} 

phương pháp này trong Toolkit của tôi, mà lấy tất cả các đối tượng mà là thể hiện của một lớp nhất định:

public static <T> ArrayList<T> getSome(ArrayList<Object> objects, Class<T> clazz) { 
    ArrayList<T> result = new ArrayList<T>(); 
    for (Object o : objects) 
     if (clazz.isInstance(o)) 
      result.add(clazz.cast(o)); 
    return result; 
} 

MyClass là không thực sự thú vị, nó là một sản phẩm nào lớp thực hiện từ SuperInterface.SubInterface

Và mảnh này trong chính:

ArrayList<Object> mObjects = new ArrayList<Object>() { 
    { 
     add(new MyClass()); //SuperInterface.SubInterface 
     add(Integer.valueOf(5)); 
     add(new String("Hello")); 
     add(new Object()); 
    } 
}; 
ArrayList<SuperInterface> mSuperInterfaces = Toolkit.getSome(mObjects, SuperInterface.class); //returns a zero-sized list. 
ArrayList<SuperInterface.SubInterface> mSubInterfaces = Toolkit.getSome(mObjects, SuperInterface.SubInterface.class); //returns a one-sized list 

Cuộc gọi phương thức đầu tiên không hoạt động như tôi mong đợi, lần thứ hai thực hiện. Là nó có thể để làm việc đầu tiên mà không rõ ràng đặt các subinterfaces trong một tập tin khác nhau và thực hiện các siêu lớp? Bởi vì dường như subinterface là không thực sự subinterface, vì vậy tôi đã cố gắng để làm cho các lớp giao diện như thế này:

public class ClassWithInterfaces { 
    public interface Super { } 
    public interface Sub implements Super { /**...*/ } 
} 

Nhưng dường như bạn không thể sử dụng implements trong một giao diện bên trong.

Câu hỏi của tôi là: Tại sao là và có cách nào để hoàn thành những gì tôi muốn đạt được (giao diện bên trong trong một tệp) không? Tôi không nhất thiết cần nó, tôi chỉ muốn biết tại sao nó không thể thực hiện trong các giao diện bên trong (nhưng nó có thể mở rộng các lớp bên trong).

Trả lời

6

Nhưng dường như bạn không thể sử dụng implements trong giao diện bên trong.

Bạn đang tìm kiếm extends hơn implements:

public class ClassWithInterfaces { 
    public interface Super { } 
    public interface Sub extends Super { /**...*/ } 
} 

này biên dịch đối với tôi, và tôi chắc chắn có thể thực hiện cả hai giao diện.

Kể từ dường như có một số rắc rối xung quanh việc mở rộng vs thực hiện, có lẽ sau đây sẽ giúp mọi việc rõ ràng lên:

  • Một giao diện kéo dài giao diện khác.
  • Một lớp học triển khai một giao diện.
  • Lớp học mở rộng một lớp khác.
+0

Từ khi nào có thể mở rộng từ giao diện? Tôi nghĩ rằng các từ khóa thực hiện và mở rộng nơi có để phân biệt giữa các lớp trừu tượng và giao diện? – stealthjong

+2

@ChristiaandeJong: Giao diện luôn * mở rộng * các giao diện khác, nó không bao giờ * triển khai * chúng. Chỉ có một lớp mới có thể thực hiện mọi thứ. – NPE

+0

Bây giờ bạn đề cập đến nó, nó thực sự khá hợp lý. Cảm ơn rất nhiều. – stealthjong

1

Theo ngôn ngữ Java Specification:

Vì vậy, ở đây bạn có hai lý do khiến bạn không thể có "thật" giao diện bên trong

Cũng , như NPE viết, một giao diện không bao giờ có thể thực hiện một giao diện khác, nó chỉ có thể mở rộng nó. Các lớp có thể thực hiện các giao diện và/hoặc mở rộng các lớp, các giao diện chỉ có thể mở rộng các giao diện. Làm cho cảm giác hoàn hảo với tôi.

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