这是作者关于开放他的 API 以扩展已处理类型的断言的帖子。第 1 课特别讨论了取消最终确定类的更改。这篇文章还给出了一个子分类的StringAssert
例子MyStringAssert
。
但是,您似乎无法StringAssert
以保持 API“流畅性”的方式扩展类。该类StringAssert
不是最终的,但它仍然不允许您StringAssert
在子类中参数化它的类型(即方法本身返回的“this”类型)。例如,假设您checkFoo
在MyStringAssert
. 如您所见,以下内容无效,因为原始StringAssert
方法返回StringAssert
:
new MyStringAssert("abcd").contains("a").checkFoo(); // compile-time error!
您只能先调用子类的方法,这是有效的,但有点蹩脚:
new MyStringAssert("abcd").checkFoo().contains("a"); // compiles
你可以考虑联系作者,甚至向他的 git 项目提交补丁。一种可能的解决方案是将参数化类型重新添加到StringAssert
中,并StringAssert
通过 中的匿名子类提供具体类型Assertions.assertThat(String)
,无论如何这是推荐的入口点。然后,其他人都可以StringAssert
按照您的描述进行子类化。我也没有测试过这个建议,但它似乎是有道理的......