Java arraylist中的调用方法,该方法包含由类使用通用参数创建的对象

时间:2018-10-18 13:45:41

标签: java generics 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 return Component1 object. Then the ()method should be usable. But, the exception message shows "The method sales()`对于类型的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 个答案:

答案 0 :(得分:3)

sales方法仅在Component1中可用。因此,如果您需要调用该方法,则应具有该方法任何子类型的Component1。如果要使其为Component1或它的子类型,则必须使用有界通配符而不是使用无界通配符,后者实际上可以是任何东西。这是更正的代码。

public ArrayList<Group1<? extends Component1>> list = null;

public void put(Group1<? extends Component1> group1) {
    list.add(group1);
}

答案 1 :(得分:1)

因此,您需要了解类擦除在Java中是如何工作的。泛型信息实际上不会传递给容器,而只是在编译器端强制执行。 Here is a good tutorial explaining it

完成您要完成的工作的最简单方法是拥有适当的界面,例如:

public interface WithSales {
    Sales sales();
}

,并确保您的组件实现了它们。然后,您适当地声明包装器,因此列表声明应类似于:

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

然后,只要 Component 的所有实例都实现 WithSales

,其余的代码就可以正常工作