2013-09-21 2 views
1

У меня есть этот класс, имеющий внутренний классдоступа внутренний класс от другого класса

public class A { 
    public class NameComparator implements Comparator<A> { 
     @Override 
     public int compare(A o1, A o2) { 
     return o1.name.compareToIgnoreCase(o2.name); 
     } 
    } 
... 
} 

И я хотел бы, чтобы этот класс NameComparator из другого класса C (который находится в другом пакете, чем A).

Пример (из С):

Collections.sort (aArrayList, A.new NameComparator());

Это не работает. Должен ли я перемещать внутренний класс NameComparator так, чтобы он не был заключен в класс A и переименовал его в нечто вроде ANameComparator? Они настолько тесно связаны с тем, что чувствует себя неловко, не ставить эту функцию в классе А.

+2

Сделать 'NameComparator'' статическим' классом. –

+0

Или используйте экземпляр A для создания экземпляра 'NameComparator'. –

+1

вам нужен экземпляр a. 'new A(). new NameComparator()' – nachokk

ответ

5

Если вы хотите использовать свой код, как это, вы должны иметь внутренний класс статический:

public class A { 
    public static class NameComparator implements Comparator<A> { 
     @Override 
     public int compare(A o1, A o2) { 
     return o1.name.compareToIgnoreCase(o2.name); 
     } 
    } 
    ... 
} 

Почему ? Потому что, если вы не отмечаете внутренний статический класс, он действителен только с экземпляром внешнего класса.

Вы должны будете создать экземпляр компаратора, как это использовать в ЗУР прецеденту:

Collections.sort(aArrayList,new A.NameComparator()); 
+0

Когда я пытаюсь это сделать, мой компилятор сообщает следующую проблему для класса C: Collections.sort (aArrayList, A.new NameComparator()); «Невозможно разрешить переменную». – nize

+1

@nize Я обновил ответ, не заметил, что там синтаксис ... – ppeterka

1

У вас есть 2 варианта.

Преобразование внутреннего класса в статический вложенный класс

public static class NameComparator implements Comparator<A> 

И C

Collections.sort(aArrayList,new A.NameComparator()); 

Или, если вы не хотите, чтобы изменить внутренний класс просто создать экземпляр A.

Collections.sort(aArrayList,new A().new NameComparator()); 
+0

Вторая альтернатива сработала, но при попытке первой альтернативы (статической), которая выглядит «лучше», я думаю, я получил ошибку, описанную в комментарии ниже. – nize

+2

Я бы не сделал внутренний класс общедоступным, но это дизайнерское решение, у вас есть синтаксическая ошибка, поэтому не скомпилировалась! – nachokk

+0

Как бы вы решили? Дополнительный внешний класс? Как бы вы связали функциональность разумным образом? – nize

Смежные вопросы