**接口的实现类的实例不能调用该接口定义的静态方法**
这是我在使用 Java 8 的 `Comparator` 时发现的,比如这段代码
`Comparator<String> comparator = Comparator.comparing(String::length).thenComparing(String.CASE_INSENSITIVE_ORDER)`
`comparing` 是 static 方法,返回一个 `Comparator` 实例,然后调用实例方法 `thenComparing`,再返回一个新的 Comparator 实例。
通过这种链式调用实现组合 comapring 的逻辑。
我突然好奇如果连续调用两次 comparing 方法会怎么样,这样后面的 comparing 逻辑不就覆盖前面的 comparing 逻辑了吗?
然后就发现这个限制🚫,这样的代码是不能通过编译的: `illegal static interface method call`。
原因:
虽然类实例可以调用该类定义的静态方法,但是这种设计是不好的,但因为需要先前兼容,只能保留这种“怀设计”了。
接口可以在定义静态方法是在 Java 8 才引入,没了历史包袱,自然可以改正这种不良设计,不再重复犯错。
同时也可以避免上述这种非法调用的情况,更好地实现的链式调用~
这是我在使用 Java 8 的 `Comparator` 时发现的,比如这段代码
`Comparator<String> comparator = Comparator.comparing(String::length).thenComparing(String.CASE_INSENSITIVE_ORDER)`
`comparing` 是 static 方法,返回一个 `Comparator` 实例,然后调用实例方法 `thenComparing`,再返回一个新的 Comparator 实例。
通过这种链式调用实现组合 comapring 的逻辑。
我突然好奇如果连续调用两次 comparing 方法会怎么样,这样后面的 comparing 逻辑不就覆盖前面的 comparing 逻辑了吗?
然后就发现这个限制🚫,这样的代码是不能通过编译的: `illegal static interface method call`。
原因:
虽然类实例可以调用该类定义的静态方法,但是这种设计是不好的,但因为需要先前兼容,只能保留这种“怀设计”了。
接口可以在定义静态方法是在 Java 8 才引入,没了历史包袱,自然可以改正这种不良设计,不再重复犯错。
同时也可以避免上述这种非法调用的情况,更好地实现的链式调用~
展开
评论
点赞
(抽奖方式:ai给个随机数,按最新时间排序 从早到晚 我一个一个算,有更好的方式可以说出来参考一下)![[色]](http://lf-web-assets.juejin.cn/obj/juejin-web/xitu_juejin_web/img/jj_emoji_3.41d9a9a.png)