使用类和接口键入Variable:继承问题

时间:2017-10-13 10:57:08

标签: java

我的项目使用外部库,该库提供类AB(其中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()方法中的“不兼容类型”,此代码无法编译。但CustomACustomB都会A(直接或间接)延伸并实施Custom,因此它与类型变量T的模式匹配。

如何使此代码有效?

编辑:我真正想要的是一种可互换地使用CustomACustomB的方式,我可以用同样的方式存储A和{{1变量类型B中的对象。

2 个答案:

答案 0 :(得分:2)

new CustomA()new CustomB()都无法在createAttrs中使用,因为您正在描述模板,此时您不会知道T的类型是什么。

它可以是CustomACustomB,但它也可以是遵循规则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中所说的是,attr1attr2必须属于同一类型T,其范围为A,实施Custom并且CustomACustomB都与其分配兼容。

不存在此类型。