java - 带有 Lombok 和 Guice 注入的 Java 链继承
问题描述
编辑:这个问题真的应该围绕 Lombok 和 Guice 而不是 vanilla java 继承。
我正在尝试使用 Lombok 和 Guice 注入实现 Java 继承链,它的工作原理如下:
1级
public abstract class Animal {
@NonNull protected String attr1;
protected abstract void method1();
void method0() {
// Some code that uses attr1
}
}
2 级
public abstract class Mammal extends Animal {
@NonNull protected String attr2;
protected abstract void method2();
@Override
void method1() {
// some logic that uses attr2
method2();
}
}
3 级
public class Wolf extends Mammal {
@Inject @NonNull private String attr1;
@Inject @NonNull private String attr2;
@Inject @NonNull private String attr3;
@Override
void method2() {
// some logic
}
}
在main
程序中,我有调用wolf.method1()
. 这里的问题是只有wolf
所有需要的属性(由于 Guice 注入),而其中的所有字段Animal
都是未定义的。我怀疑我可能可以在 Vanilla Java 中做到这一点,但是事情会变得非常混乱(我在Animal
类中有 6 个属性,在Mammal
. 有没有办法混合搭配 lombok 的注释(@NoArgsConstructor、@AllArgsConstructor 等)来完成这项工作?
谢谢。
解决方案
即使您添加了公共构造函数,您的抽象类也不能直接实例化,因为它们被声明为抽象的。如果您愿意,可以使构造函数protected
指示它们仅可用于子类。
没错,抽象类不能真正被实例化,但是为什么 Java 编译器没有捕捉到这一点并停止抱怨没有构造函数呢?
您编写的任何没有显式构造函数的类都有一个隐式的无参数构造函数。任何隐式无参数构造函数都会隐式调用其超类的无参数构造函数,即使该超类是抽象的。因此,如果链上的某个类没有无参数构造函数(因为您明确地给了它另一个构造函数),那么您的代码将无法编译。
在您在问题中提供的代码中,没有显式构造函数,因此每个类都有一个隐式的无参数构造函数。在您的实际代码中,大概您已经在某处编写了构造函数,这就是未添加隐式无参数构造函数的原因。
推荐阅读
- java - iOS swift中字节的等效数据类型是什么?
- python - 标准库中 python 中的“loop_while”谓词函数
- java - 使用 Intent.ACTION_OPEN_DOCUMENT_TREE 将文件写入目录
- javascript - 查找函数参数的数量及其名称
- javascript - Javascript - 将回调函数作为参数传递,可以接受任意数量的帐户
- r - 在 R mlogit 包中使用字符时出现计算奇点错误
- c++ - 如何在二叉树类中正确重载运算符 << ?
- python - xlWings 将字符串返回给函数
- angular - 自定义输入绑定角度 5
- javascript - 具有相同选项的多项选择