【问题标题】:No Constructor Found Java + Lombok未找到构造函数 Java + Lombok
【发布时间】:2021-06-14 03:46:38
【问题描述】:

主要

public static List<Viking> uploadVikings(){
        List<Viking> vikings = new ArrayList<Viking>();

        vikings.add(new Viking("Lean",23,100, new DrinkVikingImp(), new PeeVikingImp(),10));
        vikings.add(new Viking("Thor",24,99, new DrinkVikingImp(), new PeeVikingImp(),9));
        vikings.add(new Viking("Thanos",25,98, new DrinkVikingImp(), new PeeVikingImp(),9));
        vikings.add(new Viking("Hulk",26,97, new DrinkVikingImp(), new PeeVikingImp(),5));
        vikings.add(new Viking("Thrall",27,96, new DrinkVikingImp(), new PeeVikingImp(),3));

        return vikings;
    }

维京级

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Viking extends Human{

    public Integer proDrinker;
    public Pee pee;
    public Drink drink;

    public void pee() {pee.pee();}
    public void drink() {drink.drink();}

}

人类阶级

@Data
@AllArgsConstructor
@NoArgsConstructor
public abstract class Human {

    public String Name;
    public Integer Age;
    public Integer Weight;

}

Drink 和 Pee 界面相同

public class DrinkVikingImp implements Drink {

    @Override
    public void drink() {
        System.out.println("Viking is Drinking");
    }
}
Error: Error:(21, 21) java: no suitable constructor found for Viking(java.lang.String,int,int,com.company.models.DrinkVikingImp,com.company.models.PeeVikingImp,int)
    constructor com.company.models.Viking.Viking() is not applicable
      (actual and formal argument lists differ in length)
    constructor com.company.models.Viking.Viking(java.lang.Integer,com.company.interfaces.Pee,com.company.interfaces.Drink) is not applicable
      (actual and formal argument lists differ in length)

【问题讨论】:

标签: java constructor lombok


【解决方案1】:

这在龙目岛是不可能的。虽然这将是一个非常好的特性,但它需要解析才能找到超类的构造函数。超类只有在 Lombok 被调用时才知道名称。使用 import 语句和类路径来查找实际的类并非易事。而且在编译过程中,你不能只使用反射来获取构造函数列表。

【讨论】:

    【解决方案2】:

    您可以使用 Lombok 的 builder 生成器(@SuperBuilder 注解)来解决这个问题,它是在 1.18 版本中引入的

    @Data
    @SuperBuilder
    public abstract class Human {
    ...
    }
    
    @Data
    @SuperBuilder
    public class Viking extends Human {
    ...
    }
    

    然后你就可以如下构造你的 Viking 对象了:

        vikings.add(Viking.builder()
                .name("Lean")
                .age(23)
                .weight(100)
                .drink(new DrinkVikingImp())
                .pee(new PeeVikingImp())
                .proDrinker(10)
                .build());
    

    还要检查您的 Human 类字段名称,它们不应以大写字母开头。

    【讨论】:

      【解决方案3】:

      来自lombok

      @AllArgsConstructor 生成一个构造函数,每个构造函数有 1 个参数 类中的字段。

      根据错误信息

      com.company.models.Viking.Viking(java.lang.Integer,com.company.interfaces.Pee,com.company.interfaces.Drink) is not applicable

      你可能需要这个

      vikings.add(10, new Viking(new DrinkVikingImp(), new PeeVikingImp()));
      vikings.add(9, new Viking(new DrinkVikingImp(), new PeeVikingImp()));
      vikings.add(9, new Viking(new DrinkVikingImp(), new PeeVikingImp()));
      vikings.add(5, new Viking(new DrinkVikingImp(), new PeeVikingImp()));
      vikings.add(3, new Viking(new DrinkVikingImp(), new PeeVikingImp()));
      

      然后你必须自己设置人类属性

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-27
        • 1970-01-01
        • 2020-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多