Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有类和接口的类型变量:继承性问题_Java - Fatal编程技术网

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
字段?