Java 具有类和接口的类型变量:继承性问题
我的项目使用一个外部库,它提供类Java 具有类和接口的类型变量:继承性问题,java,Java,我的项目使用一个外部库,它提供类A和B(其中B扩展了A)。我想在a中添加一些方法,但我希望它们也在B中,因此我创建了一个接口自定义,并创建了类: CustomA扩展了一个实现自定义的 CustomB扩展B实现自定义 现在我想在类C中互换使用这两个新类,作为属性和方法参数。我发现了这个问题:,因此我尝试了以下代码: public class C<T extends A & Custom>{ private T attr1; private T attr2;
A
和B
(其中B扩展了A
)。我想在a
中添加一些方法,但我希望它们也在B
中,因此我创建了一个接口自定义
,并创建了类:
CustomA扩展了一个实现自定义的
CustomB扩展B实现自定义
C
中互换使用这两个新类,作为属性和方法参数。我发现了这个问题:,因此我尝试了以下代码:
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;
}
}
公共C类{
私人T-attr1;
私人T-attr2;
public void createAttrs(){
attr1=新CustomA();
attr2=新的CustomB();
}
公共无效集合属性1(T属性1){
this.attr1=attr1;
}
公共无效集合属性2(T属性2){
this.attr2=attr2;
}
}
但是,由于createAttrs()
方法中的“不兼容类型”,此代码未编译。但是CustomA
和CustomB
都扩展了A
(直接或间接)并实现了Custom
,因此它与类型变量T
的模式相匹配
我怎样才能使这个代码工作
编辑:我真正想要的是一种可以互换使用
CustomA
和CustomB
的方法,以同样的方式,我最初可以将A
和B
对象存储在变量类型的A
中,您在C
中说的是attr1
和attr2
必须是扩展A
的同一类型T
,实现Custom
,并且CustomA
和CustomB
都与之兼容
不存在此类类型。无论是
new CustomA()
还是new CustomB()
都不能在createAttrs
中使用,因为您正在描述模板,此时您不知道t
的类型
它可以是CustomA
或CustomB
,但也可以是遵循规则T扩展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());
}
}
C类{
私人T-attr1;
私人T-attr2;
public void createAttrs(T attr1,T attr2){
this.attr1=attr1;
this.attr2=attr2;
}
公共静态void main(字符串[]args){
新的C().createAttrs(新的CustomA(),新的CustomB());
}
}
为什么不在A中添加方法并在B中重写?例如,为什么您要使用T
?@Frank,因为他既不控制A
也不控制B
,但他控制自定义
。他可能使用泛型来解决Java还没有联合类型的问题,在变量类型中,他可以说A&Custom
。我忘了提到的是,我有一个方法void doStuff(T attr)
,可以将CustomA
或CustomB
作为参数。同样的事情也适用于我的属性,我事先不知道它是一个CustomA
还是CustomB
@BenoîtVernier,我忽略了B
扩展a
-更正了答案的事实。让这个类通用的想法是什么?为什么不使用具体的CustomA
和CustomB
字段?