Java 你能写一个不能实现的接口吗?

Java 你能写一个不能实现的接口吗?,java,interface,final,Java,Interface,Final,这是有关的。在讨论中,有一种观点认为与接口相关的final概念是模糊的。最终接口是否意味着它不能有子接口?这是否意味着它无法实现 这个问题是第一个:您能否编写一个最终接口,这样编译器就可以阻止您实现它?我将以下内容作为一个接口提交,这样编译器就可以在编译时阻止实现 interface FinalInterface { class Types { private class Alpha { } private class Beta { }

这是有关的。在讨论中,有一种观点认为与接口相关的final概念是模糊的。最终接口是否意味着它不能有子接口?这是否意味着它无法实现


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

我将以下内容作为一个接口提交,这样编译器就可以在编译时阻止实现

interface FinalInterface
{
    class Types
    {
        private class Alpha { }

        private class Beta { }
    }

    void method ( Types . Alpha param ) ;

    void method ( Types . Beta param ) ;
}

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

但这毫无意义。在这种情况下,此接口完全无用


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

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

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

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

有趣的是,C#在编译时阻止了这样一个接口,并出现了“不一致的可访问性”错误。@Jon Skeet-如果接口也声明为包私有,会发生什么?我猜错误不会出现。是的(或者更确切地说,是使用内部类型的内部接口)。另一方面,在实现该方法时,必须使用显式接口实现,因为否则必须将实现方法声明为public,这将导致相同的错误:(为什么要立即回答你自己的问题?@Thorbjørn Ravn Andersen b/c我很好奇我的FinalInterface接口是否可以实现。我发现使用反射可以实现任何接口。很好。