Я написал этот простой тестовый код, адаптировав фрагмент из книги, чтобы помочь мне понять работу универсальных методов в Java. Линия, которую я пометил: , предположительно работает, почему бы и нет?
import java.util.*;
class Test {
public static void main(String args[]){
List<Number> input = null;
List<Number> output=null;
output = Test.process(input); // fail, why??
}
public static <E extends Number> List <? super E> process (List <E> nums){
List <E>eList = new ArrayList<E>();
return eList;
}
}
edit: Ну, код работает при изменении List<? super E>
на List<E>
, это здорово, но я все еще не уверен, что я что-то упустил или книга, из которой я взял это, может иметь ошибку. Пожалуйста, прочитайте вопрос, как он появляется там:
- Учитывая метод, объявленный как:
публичный статический список
<? super E> process (Список номеров)
Программист хочет использовать этот метод следующим образом:
// INSERT DECLARATIONS HERE
output = process(input);
Какие пары объявлений можно разместить в // ВСТАВИТЬ ДЕКЛАРАЦИИ ЗДЕСЬ, чтобы
код для компиляции? (Выберите все подходящие варианты.)
A. ArrayList<Integer> input = null;
ArrayList<Integer> output = null;
B. ArrayList<Integer> input = null;
List<Integer> output = null;
C. ArrayList<Integer> input = null;
List<Number> output = null;
D. List<Number> input = null;
ArrayList<Integer> output = null;
E. List<Number> input = null;
List<Number> output = null;
F. List<Integer> input = null;
List<Integer> output = null;
G. None of the above.
Ответ: B, E и F верны.
Возвращаемый тип процесса определенно объявлен как List
, а не ArrayList
, поэтому A и D
не правы. C неверен, потому что тип возвращаемого значения оценивается как List<Integer>
, и это не может
присваиваться переменной типа List<Number>
. Конечно, все это, вероятно, приведет к
NullPointerException
поскольку переменные по-прежнему равны нулю, но вопрос только задавался нам
чтобы получить код для компиляции.
Ни одна из опций, упомянутых в книге, не сработала в моем коде. Могу ли я смело отметить это как ошибку со стороны Кэти Сьерры или я что-то здесь упускаю?