ロンボクバージョン: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>
おそらく#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<>(); }
_(わかりやすくするために、サンプルクラス名LombokBuilder
をOwner
ました)_
これで、次のようなビルダーを使用できます。
// Owner<Dog> owner = Owner.<Dog>builder().animal(new Dog()).build();
Owner<Dog> owner = Owner.builder(Dog.class).animal(new Dog()).build();
うわー、ほぼ同じ:/
最も参考になるコメント
問題は型推論に関係しています。 あなたが思っているほどには運ばない。 LombokBuilder.builder()の呼び出しには、何を入力するかについての手がかりがありません。したがって、コンパイラーをコンパイルするために少し支援する必要があります。
java final LombokBuilder<Dog> lombokBuilder = LombokBuilder.<Dog>builder().animal(new Dog()).build();
これは大した問題ではないと思います。