интерфейс с абстрактным классом
-
21-12-2019 - |
Вопрос
Возможно ли объявить интерфейс внутри абстрактного класса?.Я попробовал это, и мне успешно удалось сделать это без какой-либо ошибки компиляции??Есть ли в практическом использовании какое-либо значение этого??
Вот код, который я написал.
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
если бы это был абстрактный класс, а не интерфейс, у вас была бы именно та ситуация, которую вы описали.