如何在龙目岛调用超级构造函数

2022-08-31 06:59:39

我有一个班级

@Value
@NonFinal
public class A {
    int x;
    int y;
}

我有另一个B类

@Value
public class B extends A {
    int z;
}

lombok正在抛出错误,说它找不到A()构造函数,显式地称之为我希望龙目岛要做的是为类b提供注释,以便它生成以下代码:

public class B extends A {
    int z;
    public B( int x, int y, int z) {
        super( x , y );
        this.z = z;
    }
}

我们在龙目岛有注释来做到这一点吗?


答案 1

这在龙目岛是不可能的。虽然这将是一个非常好的功能,但它需要分辨率来找到超类的构造函数。超级类只有在龙目岛被调用的那一刻才知道名字。使用 import 语句和类路径来查找实际的类并非易事。在编译过程中,您不能只使用反射来获取构造函数列表。

这并非完全不可能,但是使用分辨率的结果已经告诉我们,这是困难且容易出错的。val@ExtensionMethod

披露:我是龙目岛开发者。


答案 2

龙目岛第78期引用了这个页面 https://www.donneo.de/2015/09/16/lomboks-builder-annotation-and-inheritance/ 这个可爱的解释:

@AllArgsConstructor 
public class Parent {   
     private String a; 
}

public class Child extends Parent {
  private String b;

  @Builder
  public Child(String a, String b){
    super(a);
    this.b = b;   
  } 
} 

因此,您可以像这样使用生成的构建器:

Child.builder().a("testA").b("testB").build(); 

官方文档对此进行了解释,但它没有明确指出您可以通过这种方式促进它。

我还发现这与Spring Data JPA配合得很好。


推荐