无法访问以下代码中的方法名称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;
}
}
答案 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
,其余的代码就可以正常工作