之前的版本里 interface 中的方法必须是抽象方法,不能有方法体。现在可以添加 interface 内方法,只需要在方法的前面加一个 default 关键字,表示属于接口内部默认存在的方法。
如果两个接口包括的默认方法同名,当一个 class 同时实现这两个接口,并调用他们共同的 default方法,则程序会报错。
注意:
default 方法一定程度上,解决了接口的实现的需要适配器的情景,比如 以前要使用 WebMvcConfigurer,因为其方法都是抽象的,我们需要使用一个适配器去做一个默认实现(比如 WebMvcConfigurerAdapter),而现在我们可以直接 implements 它,而不必使用适配器去解决方法抽象问题,因为其所有抽象方法都被 default 关键字取代了。
源码:
public interface WebMvcConfigurer { default void configurePathMatch(PathMatchConfigurer configurer) {
} default void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
} default void configureAsyncSupport(AsyncSupportConfigurer configurer) {
} default void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
} default void addFormatters(FormatterRegistry registry) {
} default void addInterceptors(InterceptorRegistry registry) {
} default void addResourceHandlers(ResourceHandlerRegistry registry) {
} default void addCorsMappings(CorsRegistry registry) {
} default void addViewControllers(ViewControllerRegistry registry) {
} default void configureViewResolvers(ViewResolverRegistry registry) {
} default void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
} default void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {
} default void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
} default void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
} default void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
} default void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
} @Nullable
default Validator getValidator() {
return null;
} @Nullable
default MessageCodesResolver getMessageCodesResolver() {
return null;
} }
233