Ну, теперь лучше. Дело в том, что ни интерфейс, ни класс не являются статическими - их можно создать только с использованием экземпляра Test
, попробуйте
Icmp test = (new Test()).new Icmp()
В качестве альтернативы, вы можете сделать статический внутренний класс и интерфейс:
public class Test {
public static void main(String[] args) {
Icmp test = new Icmp();
}
public static interface Cmp {
public int cmp(Object x, Object y);
}
static class Icmp implements Cmp {
public int cmp(Object o1, Object o2) {
int i1 = ((Integer) o1).intValue();
int i2 = ((Integer) o2).intValue();
if (i1 < i2)
return -1;
else if (i1 == i2)
return 0;
else
return 1;
}
}
}
Еще один вариант - избавиться от внутренних классов / интерфейсов:
interface Cmp {
public int cmp(Object x, Object y);
}
class Icmp implements Cmp {
public int cmp(Object o1, Object o2) {
int i1 = ((Integer) o1).intValue();
int i2 = ((Integer) o2).intValue();
if (i1 < i2)
return -1;
else if (i1 == i2)
return 0;
else
return 1;
}
}
public class Test {
public static void main(String[] args) {
Icmp test = new Icmp();
}
}
Как видите, все решения похожи, поэтому фактический код был жизненно важен для получения разумного ответа.
Отслеживание комментариев: внутренний класс (буквально класс в другом классе) означает, что этот класс является частью включающего объекта. Или, если он статический - часть окружающего класса. Важная вещь о нестатических внутренних классах состоит в том, что они могут получить доступ к членам (полям, методам, в том числе частным) окружающего объекта; отсюда хитрый синтаксис.
Чтобы внутренний объект класса мог это сделать, он хранит неявную ссылку на включающий объект.
С интерфейсами, как справедливо говорит @Voo, вы никогда не получаете доступ к чему-либо и никогда не имеете ссылок - внутренние интерфейсы всегда статичны.
Для дальнейшего чтения возьмите книги Кэти Сьерра. Или JLS, если вы предпочитаете хардкорные спецификации.