Вызов метода в Java-массиве, который содержит объекты, созданные классом с общими аргументами - PullRequest
0 голосов
/ 18 октября 2018

Вызов имени метода sales() в кодах ниже недоступен.Объектами в массиве являются класс 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 Компонент1 object. Then the sales () method should be usable. But, the exception message shows "The method sales ()`не определено для типа захвата # 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 голосов
/ 18 октября 2018

Итак, вам нужно понять, как стирание классов работает в Java.Общая информация никогда не передается в контейнер, она применяется только на стороне компилятора. Вот хороший учебник, объясняющий это .

Самый простой способ достичь того, чего вы хотите достичь - это иметь соответствующий интерфейс, например:

public interface WithSales {
    Sales sales();
}

и убедитесь, что ваши компоненты влияют на них.Затем вы объявляете свои обертки соответствующим образом, чтобы объявление списка выглядело так:

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

Тогда остальная часть вашего кода будет работать нормально, если все экземпляры Component реализовать WithSales

0 голосов
/ 18 октября 2018

Метод sales доступен только в Component1.Поэтому, если вам нужно вызвать этот метод, вы должны иметь либо Component1 любого его подтипа.Если вы хотите сделать его либо Component1, либо его подтипом, тогда вы должны использовать ограниченный подстановочный знак вместо неограниченного подстановочного знака, который может быть буквально любым.Вот исправленный код.

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

public void put(Group1<? extends Component1> group1) {
    list.add(group1);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...