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).
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
@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
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