Lombok: Builderがジェネリックに対して間違った型を返す

作成日 2017年10月24日  ·  3コメント  ·  ソース: projectlombok/lombok

ロンボクバージョン:1.16.18

ジェネリックでLombokビルダーを使用すると、間違ったタイプに関連するコンパイルエラーが発生します。

public class Main {

    public static abstract class Animal {
    }

    public static class Dog extends Animal {
    }

    <strong i="7">@Getter</strong>
    <strong i="8">@Setter</strong>
    public static class SimpleBuilder<ANIMAL extends Animal> {
        private ANIMAL animal;
    }

    <strong i="9">@Getter</strong>
    @lombok.Builder
    public static class LombokBuilder<ANIMAL extends Animal> {
        private ANIMAL animal;
    }

    public static void main(String[] args) {
        //COMPILES OK:
        final SimpleBuilder<Dog> simpleBuilder = new SimpleBuilder<>();
        simpleBuilder.setAnimal(new Dog());

        //COMPILATION ERROR:
        final LombokBuilder<Dog> lombokBuilder = LombokBuilder.builder().animal(new Dog()).build();
    }
}

LombokBuilderは次のエラーを出します:

Required: LombokBuilder <Dog>
Found: LombokBuilder <Animal>

最も参考になるコメント

問題は型推論に関係しています。 あなたが思っているほどには運ばない。 LombokBuilder.builder()の呼び出しには、何を入力するかについての手がかりがありません。したがって、コンパイラーをコンパイルするために少し支援する必要があります。

java final LombokBuilder<Dog> lombokBuilder = LombokBuilder.<Dog>builder().animal(new Dog()).build();

これは大した問題ではないと思います。

全てのコメント3件

おそらく#1420に関連しています。

問題は型推論に関係しています。 あなたが思っているほどには運ばない。 LombokBuilder.builder()の呼び出しには、何を入力するかについての手がかりがありません。したがって、コンパイラーをコンパイルするために少し支援する必要があります。

java final LombokBuilder<Dog> lombokBuilder = LombokBuilder.<Dog>builder().animal(new Dog()).build();

これは大した問題ではないと思います。

@Builderを使用すると、クラスに少し乾燥した構文を追加できます。

public static <T extends Animal> Owner.OwnerBuilder<T> builder(Class<T> cls) { return new Owner.OwnerBuilder<>(); }

_(わかりやすくするために、サンプルクラス名LombokBuilderOwnerました)_

これで、次のようなビルダーを使用できます。

// Owner<Dog> owner = Owner.<Dog>builder().animal(new Dog()).build();
Owner<Dog> owner = Owner.builder(Dog.class).animal(new Dog()).build();

うわー、ほぼ同じ:/

このページは役に立ちましたか?
0 / 5 - 0 評価