Можете ли вы написать интерфейс, который не может быть реализован? - PullRequest
4 голосов
/ 12 сентября 2010

Это связано с финальным интерфейсом в java .Среди обсуждений было то, что концепция финала по отношению к интерфейсам неоднозначна.Будет ли окончательный интерфейс означать, что он не может иметь подынтерфейсов?Значит ли это, что у него не может быть реализаций?

Этот вопрос первый: можете ли вы написать окончательный интерфейс, такой, чтобы компилятор не позволил вам его реализовать?

Ответы [ 3 ]

4 голосов
/ 12 сентября 2010

Как я покажу, вышеописанный интерфейс можно реализовать с помощью прокси. Более значимый вопрос: почему вы пытаетесь создать неосуществимый интерфейс? Даже с философской точки зрения это кажется довольно поверхностным.

import java.lang.reflect.Proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

class NoFinal
{
    public static void main(String[] a) throws Throwable
    {
        FinalInterface o = (FinalInterface) Proxy.newProxyInstance(FinalInterface.class.getClassLoader(), new Class[]{FinalInterface.class}, new InvocationHandler()
        {
            public Object invoke(Object proxy, Method method, Object[] args)
            {
                System.out.println(method);
                return null;
            }
        });
        Method[] methods = FinalInterface.class.getDeclaredMethods();
        methods[0].invoke(o, new Object[]{null});
        methods[1].invoke(o, new Object[]{null});
    }
}

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

2 голосов
/ 12 сентября 2010

Я представляю следующее в качестве интерфейса, так что реализация будет предотвращена во время компиляции.

interface FinalInterface
{
    class Types
    {
        private class Alpha { }

        private class Beta { }
    }

    void method ( Types . Alpha param ) ;

    void method ( Types . Beta param ) ;
}
1 голос
/ 12 сентября 2010

Технически это можно сделать, указав параметры, недоступные для разработчиков - например, в том же пакете, что и интерфейс, с видимостью частного пакета.

Но это не имеет никакого смысла. Этот интерфейс совершенно бесполезен в этом случае.

Обновление: одно использование приходит на ум, но это не должно быть сделано. Если вы хотите использовать интерфейсы для константных определений, чтобы сэкономить кучу модификаторов, которые предполагает интерфейс, но вы не хотите использовать анти-шаблон реализации интерфейса только для констант.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...