Вопрос

Возможно ли объявить интерфейс внутри абстрактного класса?.Я попробовал это, и мне успешно удалось сделать это без какой-либо ошибки компиляции??Есть ли в практическом использовании какое-либо значение этого??

Вот код, который я написал.

public abstract class X 
{
   public interface abc extends I1 
   {
        public void sum(int i,int j);
   }
}


  public class Impl extends X 
  {
    class InnerImpl implements abc
   {
        @Override
        public int sum(int i, int j)
        {
          return i+j;
        }
   }
 }



public interface I1 
{
}
Это было полезно?

Решение

Вы можете объявить интерфейс внутри какой-нибудь класс, а не просто абстрактный.Интерфейс неявно static, таким образом, ваш заключающий класс просто предоставляет область пространства имен и в остальном не связан с интерфейсом.

Полезность этого определенно существует, и я использовал его несколько раз.Часто интерфейс связан с методом того же класса, поэтому клиенты могут передавать реализации этого интерфейса методу.

С появлением Java 8 и функциональных типов интерфейсов распространение локальных интерфейсов будет только увеличиваться.

Другие советы

Да, это возможно.Как вы сказали - он компилируется (и, я полагаю, запускается), так что это законно.
На самом деле законно объявлять подинтерфейс в интерфейсе или перечисление (но только общедоступные, поскольку частные не имеют никакого смысла в интерфейсе, точно так же, как частные методы).

Что касается практического применения:Вы можете объявить закрытый внутренний класс в своем абстрактном классе и использовать его в методах указанного абстрактного класса (я надеюсь, вы сможете придумать для этого применение).Или два из них.И если вам нужен общий контракт для обоих - вы можете использовать интерфейс.Или вам нужно было бы вернуть конкретную вещь, которая не имеет смысла вне родительского класса.

Более практичным примером является интерфейс Map и это подинтерфейс Map.Entry.Некоторые методы Map возвращение и Entry, и все же вход бессмыслен без Map, so не является автономным интерфейсом.Если Map если бы это был абстрактный класс, а не интерфейс, у вас была бы именно та ситуация, которую вы описали.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top