ここでは、既に処理された型のアサーションを拡張するためのAPIを開くことについて、著者によってa postがあります。特にレッスン1では、クラスを未定義クラスに変更する方法について説明します。この投稿では、サブクラスStringAssert
の例がMyStringAssert
となっています。
しかし、StringAssert
などのクラスをAPIの「流暢さ」を維持するように拡張することはできないようです。 StringAssert
クラスはfinalクラスではありませんが、サブクラスでそのタイプ(すなわち、StringAssert
のメソッドによって返される「this」タイプ)をパラメータ化することはできません。たとえば、MyStringAssert
にメソッドcheckFoo
を追加したとします。あなたが発見したように、元のStringAssert
メソッドが返すので、以下は無効ですStringAssert
:
new MyStringAssert("abcd").contains("a").checkFoo(); // compile-time error!
あなただけの種類のラメ有効ですが、これは、最初のサブクラスのメソッドを呼び出すことができます。
は
new MyStringAssert("abcd").checkFoo().contains("a"); // compiles
あなたは考えるかもしれません著者に連絡するか、gitプロジェクトにパッチを提出することさえできます。可能な解決策は、StringAssert
にパラメータ化された型を追加し、Assertions.assertThat(String)
の匿名サブクラスを使用してStringAssert
具体的な型を指定することです。これはとにかく推奨されるエントリポイントです。あなたが説明したように、他の人はサブクラスStringAssert
を作成できます。私はこの提案もテストしていませんが、意味があるようです...
私はXOR接続として、彼らはスローする。 (しかし、私はネイティブの英語のスピーカーではありません) –
どちらも私ですが、あなたは正しくはないと思います。 AFAIKは、選択の存在を強調したいときに「どちらか」を使用することもできます。また、 'hamcrest'はこれをこの方法で使います。 – maaartinus
流暢なアサーションへのリンクは404です。 –