为了账号安全,请及时绑定邮箱和手机立即绑定

java arraylist 中的调用方法,其中包含由具有泛型参数的类创建的对象

java arraylist 中的调用方法,其中包含由具有泛型参数的类创建的对象

慕桂英4014372 2021-11-24 19:10:05
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);

}


查看完整回答
反对 回复 2021-11-24
?
四季花海

TA贡献1811条经验 获得超5个赞

因此,您需要了解类擦除在 Java 中的工作原理。通用信息实际上从未传递给容器,它仅在编译器端强制执行。 这是一个很好的教程解释它

完成您要完成的任务的最简单方法是拥有一个合适的界面,例如:

public interface WithSales {
    Sales sales();
    }

并确保您的组件实现它们。然后你适当地声明你的包装器,所以你的列表声明看起来像:

public List<Group1<? extends WithSales>> list = new ArrayList<>();

然后,只要Component 的所有实例都实现WithSales,其余的代码就可以正常工作


查看完整回答
反对 回复 2021-11-24
  • 2 回答
  • 0 关注
  • 151 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信