Java Generics: не найдено подходящего конструктора для ArrayList (List ) - PullRequest
0 голосов
/ 28 мая 2020

Итак, вопросы требуют от меня разработки метода d, который будет принимать список и класс и возвращать его содержимое обратно.

Write a class D that passes the following test.
jshell> class E { public String toString() { return "E"; }}
jshell> class F extends E { public String toString() { return "F"; }}
jshell> List<E> p = D.add(new ArrayList<E>(), new E())
jshell> List<F> q = D.add(new LinkedList<F>(), new F())
jshell> List<E> r = D.add(D.add(new LinkedList<E>(), new E()), new F())
jshell> List<F> s = D.add(D.add(new ArrayList<F>(), new F()), new F())
jshell> /var
| List<E> p = [E]
| List<F> q = [F]
| List<E> r = [E, F]
| List<F> s = [F, F]
jshell> List<E> x = D.join(p, q) // join q to the end of p
jshell> List<E> y = D.join(p, p)
jshell> List<F> z = D.join(q, q)
jshell> /var
| List<E> p = [E]
| List<F> q = [F]
| List<E> r = [E, F]
| List<F> s = [F, F]
| List<E> x = [E, F]
| List<E> y = [E]
| List<F> z = [F]

Мой текущий код выглядит так

import java.util.List;
import java.util.ArrayList;

class D {

    public static <T> List <T> add(List<? super T> s,T t) {   
        s.add(t);
        return new ArrayList<T>(s);
    }
}

Я продолжаю получать эту ошибку: не найдено подходящего конструктора для ArrayList (List)

Я должен ввести значение toString этого в ArrayList, однако s.add(t.toString()); также выдает ошибку

1 Ответ

3 голосов
/ 28 мая 2020

A List<? super T> не является супертипом List<T>. Даже этот return new ArrayList<T>(s); не будет работать, поскольку s не того же типа, что и создаваемый новый ArrayList. Вы также не можете взять кучу объектов, которые являются экземплярами супертипа из T, и вернуть коллекцию T. Представьте, если бы s было List<Object>, а t было String. Ваш метод должен будет возвращать List<String>, что невозможно, если вы каким-то образом не знаете, что все объекты в s являются секретными строками.

Кроме того, почему вы добавляете t к s а затем вернуть новый список ArrayList, который составляет всего s? Таким образом вы изменяете s.

Вероятно, вам следует сделать

public static <T> List <T> add(List<T> s, T t) {
    List<T> res = new ArrayList<>(s);
    res.add(t);
    return res;
}

Вы также можете сделать это, если тип t может быть менее конкретным c чем элементы в s.

public static <T> List <T> add(List<? extends T> s, T t) {
    List<T> res = new ArrayList<>(s);
    res.add(t);
    return res;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...