0

私は、ケース クラスを宣言することで得られるすべての同じメソッドを生成するマクロ アノテーション プロセッサを作成しましたが、ハッシュ コンシングを提供します。少しトリッキーでしたが、全体として、結果には非常に満足しています。ただし、applyまだ解決していないメソッドの周りにいくつかの動作が見られます。

以前は、クラスFooがケース クラスであるか、手動で定義されたapplyメソッドを持っている場合、 のようなコードを書くことができましfoos.map(Foo)た。ただし、メソッドがマクロ プロセッサによって生成されると、次のようなエラーが表示されます。

type mismatch;
[error]  found   : Foo.type
[error]  required: String => ?

foos.map(Foo.apply)コードをorとして書き直すだけでfoos.map(Foo(_))機能しますが、この動作の違いの原因となる生成中のコードの違いを識別することができませんでした。

これは、Scala コンパイラーがシンボルをオブジェクト名などではなく型名に解決しようと熱心に取り組んでいるように思われますが、ここでより良い方法がある場合は、知っておくとよいでしょう。

4

1 に答える 1

1

@LuisMiguelMejíaSuárez と @DmytroMitin が指摘したように、私の重大な見落としは、(ほとんどの) ケース クラス コンパニオン オブジェクトがFunctionNクラスから継承することです。それを新規または既存のコンパニオン オブジェクトの親に追加すると、問題が解決します。

于 2019-05-11T12:37:04.953 に答える