gpt4 book ai didi

java - 具有类和接口(interface)的类型变量 : inheritence problems

转载 作者:行者123 更新时间:2023-11-30 02:21:21 24 4
gpt4 key购买 nike

我的项目使用一个外部库,它提供类AB(其中B扩展A)。我想向 A 添加一些方法,但我也希望它们位于 B 中,所以我创建了一个接口(interface) Custom 并创建类(class):

  • CustomA 扩展 A 实现 Custom
  • CustomB 扩展 B 实现 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 一样 和类型为 A 的变量中的 B 对象。

最佳答案

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());
}
}

关于java - 具有类和接口(interface)的类型变量 : inheritence problems,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46728313/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com