未找到任何构造函数Java+;龙目

未找到任何构造函数Java+;龙目,java,constructor,lombok,Java,Constructor,Lombok,主要 人类阶级 @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
@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;

}

发件人:

@AllArgsConstructor为每个构造函数生成一个具有1个参数的构造函数 在你们班上

基于错误消息

com.company.models.Viking.Viking(java.lang.Integer、com.company.interfaces.Pee、com.company.interfaces.Drink)不适用

你可能需要这个

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)

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

你可以使用Lombok的生成器(@SuperBuilder annotation)解决这个问题,该生成器是在1.18版中引入的

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()));
然后,您将能够按照如下方式构建Viking对象:

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

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

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

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

这里可能回答了您要查找的问题:
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()));
@Data
@SuperBuilder
public abstract class Human {
...
}

@Data
@SuperBuilder
public class Viking extends Human {
...
}
    vikings.add(Viking.builder()
            .name("Lean")
            .age(23)
            .weight(100)
            .drink(new DrinkVikingImp())
            .pee(new PeeVikingImp())
            .proDrinker(10)
            .build());