猿问

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

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;

    }

}   



慕桂英4014372
浏览 152回答 2
2回答

米琪卡哇伊

该sales方法仅在Component1. 因此,如果您需要调用该方法,您应该拥有该方法Component1的任何子类型。如果您想使用它Component1或它的子类型,那么您必须使用有界通配符,而不是使用无界通配符,它实际上可以是任何东西。这是更正后的代码。public ArrayList<Group1<? extends Component1>> list = null;public void put(Group1<? extends Component1> group1) {&nbsp; &nbsp; list.add(group1);}

四季花海

因此,您需要了解类擦除在 Java 中的工作原理。通用信息实际上从未传递给容器,它仅在编译器端强制执行。&nbsp;这是一个很好的教程解释它。完成您要完成的任务的最简单方法是拥有一个合适的界面,例如:public&nbsp;interface&nbsp;WithSales&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;Sales&nbsp;sales(); &nbsp;&nbsp;&nbsp;&nbsp;}并确保您的组件实现它们。然后你适当地声明你的包装器,所以你的列表声明看起来像:public&nbsp;List<Group1<?&nbsp;extends&nbsp;WithSales>>&nbsp;list&nbsp;=&nbsp;new&nbsp;ArrayList<>();然后,只要Component 的所有实例都实现WithSales,其余的代码就可以正常工作
随时随地看视频慕课网APP

相关分类

Java
我要回答