这与final interface in java有关。在讨论中,有关接口的最终概念是模糊的。最后的接口是否意味着它不能有子接口?这是否意味着它无法实现?
这是第一个问题:您是否可以编写最终接口,以便编译器阻止您实现它?
答案 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)
从技术上讲,您可以通过指定实现者无法访问的参数(例如,在与接口相同的包中),使用包私有可见性。
但这没有任何意义。在这种情况下,此界面完全无用。
更新:我想到了一个用途,但不应该这样做。如果你想使用接口进行常量定义,为了节省接口所假设的一组修饰符,但你不想使用实现常量接口的反模式。