代码之家  ›  专栏  ›  技术社区  ›  emory

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

  •  4
  • emory  · 技术社区  · 15 年前

    这与 final interface in java . 在讨论中,有一种观点认为final与接口的关系是模棱两可的。最终接口是否意味着它不能有子接口?这是否意味着它不能有实现?

    这个问题是第一个:你能不能写一个最终的接口,让编译器阻止你实现它?

    3 回复  |  直到 9 年前
        1
  •  4
  •   Matthew Flaschen    15 年前

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

    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
  •  2
  •   emory    15 年前

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

    interface FinalInterface
    {
        class Types
        {
            private class Alpha { }
    
            private class Beta { }
        }
    
        void method ( Types . Alpha param ) ;
    
        void method ( Types . Beta param ) ;
    }
    
        3
  •  1
  •   Bozho    15 年前

    但这没有任何意义。这个接口在这种情况下是完全无用的。