универсальный / интерфейсный метод не применим - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть интерфейс Vegetable, например, с яблоками, морковью ... У меня есть класс Collector универсального типа, он может быть Collector из цветной капусты, моркови и т. Д. Мне нужно реализовать функцию, чтобы датьПеренесенный объект одного коллекционера в другой, проблема в том, что если я попробую Collector.giveTo (Collector), он не распознает, что яблоки расширены из Vegetable.Я попытался сделать это с instanceof, но безуспешно

Вот конструктор моего класса Collector:

/** define collectors able to collect (and carry) one specific type T of objects
 * only one T object can be carried at a time
 */

public class Collector<T> {

private String name;
protected  T carriedObject = null;

/**
 * Creates a Collector object with a name and no carriedObject (carriedObject = null)
 * @param name a String, the name of the Collector
 */
public Collector(String name) {
this.name = name;
this.carriedObject = carriedObject;
}

и код для некоторых используемых методов:

/** 
 * give the carriedObject to another Collector
 * @param other the Collector to give the carriedObject to
 * @throws AlreadyCarryingException if the other Collector is already carrying an object
 */
public void giveTo(Collector<T> other) throws AlreadyCarryingException {
    if (this instanceof Vegetable && other instanceof Vegetable){
        if (other.getCarriedObject() != null){
            throw new AlreadyCarryingException("Le collector porte deja un objet");
        }
        else {
            other.take(this.drop());
        }
    }

/**
 * drops the carriedObject setting it to null
 */
public T drop(){
    T tmp = this.carriedObject;
    this.carriedObject = null;
    return tmp;
}

/**
 * allows the Collector to take an object and sets it as his carriedObject
 * @param object the Object to take
 * @throws AlreadyCarryingException if the Collector is already carrying an object
 */
public void take(T object) throws AlreadyCarryingException {
    //Collector is already carrying an object
    if (this.carriedObject != null) {
        throw new AlreadyCarryingException("Le collector porte deja un objet");
    }
    else{
        this.carriedObject = object;
    }
}

Пример: я добавил код взятия и удаления

и пример:

Collector<Carrot> carrotCollector1 = new Collector<Carrot>("carrot-collector-1");
Collector<Vegetable> vegetableCollector = new Collector<Vegetable>("vegetable-collector");
carrotCollector1.giveTo(vegetableCollector);

, и вот ошибка, которую я получаю:

МетодgiveTo (Collector) в типе Collector не применим для аргументов (Collector)

1 Ответ

0 голосов
/ 25 сентября 2018

Правильный способ будет изменить ваш метод на:

public void giveTo(Collector<? super T> other) throws AlreadyCarryingException {
   // ... omitted some code  
   other.take(drop());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...