你能写一个无法实现的接口吗?

时间:2010-09-12 07:18:29

标签: java interface final

这与final interface in java有关。在讨论中,有关接口的最终概念是模糊的。最后的接口是否意味着它不能有子接口?这是否意味着它无法实现?

这是第一个问题:您是否可以编写最终接口,以便编译器阻止您实现它?

3 个答案:

答案 0 :(得分:4)

正如我将要展示的那样,可以使用代理实现上面的接口。更有意义的问题是,为什么要尝试创建一个无法实现的界面?即使作为一个哲学观点,它似乎也很浅薄。

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});
    }
}

这不会在编译或运行时给出错误,并且它表明您可以使用两种可调用的方法创建此接口的实例。

答案 1 :(得分:2)

我将以下内容作为接口提交,以便在编译时阻止实现。

interface FinalInterface
{
    class Types
    {
        private class Alpha { }

        private class Beta { }
    }

    void method ( Types . Alpha param ) ;

    void method ( Types . Beta param ) ;
}

答案 2 :(得分:1)

从技术上讲,您可以通过指定实现者无法访问的参数(例如,在与接口相同的包中),使用包私有可见性。

但这没有任何意义。在这种情况下,此界面完全无用。

更新:我想到了一个用途,但不应该这样做。如果你想使用接口进行常量定义,为了节省接口所假设的一组修饰符,但你不想使用实现常量接口的反模式。