我的项目使用外部库,该库提供类A
和B
(其中B extends A
)。我想为A
添加一些方法,但我希望它们也在B
中,所以我创建了一个接口Custom
并创建了类:
CustomA extends A implements Custom
CustomB extends B implements Custom
我现在想要在类C
中使用这两个新类可互换作为属性和方法参数。我找到了这个问题:Declare an attribute that both extends a class and implements an interface,所以我尝试了以下代码:
public class C<T extends A & Custom>{
private T attr1;
private T attr2;
public void createAttrs() {
attr1 = new CustomA();
attr2 = new CustomB();
}
public void setAttr1(T attr1) {
this.attr1 = attr1;
}
public void setAttr2(T attr2) {
this.attr2 = attr2;
}
}
但是由于createAttrs()
方法中的“不兼容类型”,此代码无法编译。但CustomA
和CustomB
都会A
(直接或间接)延伸并实施Custom
,因此它与类型变量T
的模式匹配。
如何使此代码有效?
编辑:我真正想要的是一种可互换地使用CustomA
和CustomB
的方式,我可以用同样的方式存储A
和{{1变量类型B
中的对象。
答案 0 :(得分:2)
new CustomA()
和new CustomB()
都无法在createAttrs
中使用,因为您正在描述模板,此时您不会知道T
的类型是什么。
它可以是CustomA
或CustomB
,但它也可以是遵循规则T extends A & Custom
的任何类。
使类通用并在其中使用具体实现是没有意义的。所以我建议从方法参数中获取这些属性:
class C<T extends A & Custom> {
private T attr1;
private T attr2;
public void createAttrs(T attr1, T attr2) {
this.attr1 = attr1;
this.attr2 = attr2;
}
public static void main(String[] args) {
new C<>().createAttrs(new CustomA(), new CustomB());
}
}
答案 1 :(得分:0)
您在C
中所说的是,attr1
和attr2
必须属于同一类型T
,其范围为A
,实施Custom
并且CustomA
和CustomB
都与其分配兼容。
不存在此类型。