未找到构造函数 Java + Lombok
No Constructor Found Java + Lombok
主要
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;
}
维京人Class
@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();}
}
人类Class
@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)
来自lombok:
@AllArgsConstructor generates a constructor with 1 parameter for each
field in your class.
根据错误信息
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()));
然后还得自己设置人物属性
您可以使用 1.18 版本引入的 Lombok 构建器生成器(@SuperBuilder 注解)解决此问题
@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());
同时检查您的人类 class 字段名称,它们不应以大写字母开头。
这在龙目岛是不可能的。虽然这将是一个非常好的功能,但它需要解决才能找到超级 class 的构造函数。 super class 只有在 Lombok 被调用时才知道名字。使用导入语句和 class 路径查找实际的 class 并非易事。在编译过程中,你不能只使用反射来获取构造函数列表。
主要
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;
}
维京人Class
@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();}
}
人类Class
@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)
来自lombok:
@AllArgsConstructor generates a constructor with 1 parameter for each field in your class.
根据错误信息
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()));
然后还得自己设置人物属性
您可以使用 1.18 版本引入的 Lombok 构建器生成器(@SuperBuilder 注解)解决此问题
@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());
同时检查您的人类 class 字段名称,它们不应以大写字母开头。
这在龙目岛是不可能的。虽然这将是一个非常好的功能,但它需要解决才能找到超级 class 的构造函数。 super class 只有在 Lombok 被调用时才知道名字。使用导入语句和 class 路径查找实际的 class 并非易事。在编译过程中,你不能只使用反射来获取构造函数列表。