Lombok: Builder gibt falschen Typ für Generika zurück

Erstellt am 24. Okt. 2017  ·  3Kommentare  ·  Quelle: projectlombok/lombok

Lombok-Version: 1.16.18

Die Verwendung des Lombok-Builders auf Generika führt zu einem Kompilierungsfehler, der mit falschen Typen zusammenhängt:

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 gibt folgenden Fehler aus:

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

Hilfreichster Kommentar

Das Problem hat mit der Typinferenz zu tun. Es trägt nicht so weit, wie Sie denken. Der Aufruf von LombokBuilder.builder() hat keine Ahnung, was Sie eingeben werden. Sie müssen dem Compiler also ein wenig helfen, damit er kompiliert wird:

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

Ich glaube nicht, dass dies ein Lombok-Problem ist.

Alle 3 Kommentare

Möglicherweise verwandt mit #1420.

Das Problem hat mit der Typinferenz zu tun. Es trägt nicht so weit, wie Sie denken. Der Aufruf von LombokBuilder.builder() hat keine Ahnung, was Sie eingeben werden. Sie müssen dem Compiler also ein wenig helfen, damit er kompiliert wird:

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

Ich glaube nicht, dass dies ein Lombok-Problem ist.

Sie können eine etwas weniger trockene Syntax in Ihrer Klasse mit einem @Builder hinzufügen:

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

_(Ich habe den Beispielklassennamen LombokBuilder Owner aus Gründen der Übersichtlichkeit in

Jetzt können Sie den Builder wie folgt verwenden:

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

Wohoo, fast das gleiche :/

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen