sales()无法访问以下代码中调用方法名称。arraylist 中的对象是类 Group1 which uses generic arguments. And,Division_a.list.get(0) shoud have the Group1 object. And,Division_a.list.get(0).getComponent() should returnComponent1 object. Then thesales() method should be usable. But, the exception message shows "The methodsales()` is undefined for the type capture#2-of ?”我的谜团是Division_a.list.get(0).getComponent() 不返回 Component1 类的对象,尽管返回类型被定义为“public T getComponent()..”import java.util.ArrayList;public class Division_a { public ArrayList<Group1<?>> list=null; public Division_a() { list=new ArrayList(); } public void put(Group1<?> group1) { list.add(group1); } public static void main(String[] args) { Group1<Component1> groupcomponent1 = new Group1<>(new Component1()); Division_a division_a = new Division_a(); division_a.put(groupcomponent1); division_a.list.get(0).getComponent().sales(); //excetion occur }}class Component1 { public void sales() { System.out.println("component1 sold"); }} class Group1<T> { public T component; Group1(T component){ this.component=component; } public T getComponent() { //return type T return component; } public void setComponent(T component) { this.component=component; }}
2 回答
米琪卡哇伊
TA贡献1998条经验 获得超6个赞
该sales方法仅在Component1. 因此,如果您需要调用该方法,您应该拥有该方法Component1的任何子类型。如果您想使用它Component1或它的子类型,那么您必须使用有界通配符,而不是使用无界通配符,它实际上可以是任何东西。这是更正后的代码。
public ArrayList<Group1<? extends Component1>> list = null;
public void put(Group1<? extends Component1> group1) {
list.add(group1);
}
四季花海
TA贡献1811条经验 获得超5个赞
因此,您需要了解类擦除在 Java 中的工作原理。通用信息实际上从未传递给容器,它仅在编译器端强制执行。 这是一个很好的教程解释它。
完成您要完成的任务的最简单方法是拥有一个合适的界面,例如:
public interface WithSales { Sales sales(); }
并确保您的组件实现它们。然后你适当地声明你的包装器,所以你的列表声明看起来像:
public List<Group1<? extends WithSales>> list = new ArrayList<>();
然后,只要Component 的所有实例都实现WithSales,其余的代码就可以正常工作
添加回答
举报
0/150
提交
取消