**接口的实现类的实例不能调用该接口定义的静态方法**

这是我在使用 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 才引入,没了历史包袱,自然可以改正这种不良设计,不再重复犯错。

同时也可以避免上述这种非法调用的情况,更好地实现的链式调用~
展开
chen_xi于2020-04-30 01:07发布的图片
chen_xi于2020-04-30 01:07发布的图片
评论