Я так понимаю, вы не можете привязать параметр типа Java generics к нижней границе (то есть с помощью ключевого слова super
). Я читал то, что было сказано в FAQ Angelika Langer Generics по этой теме . Они говорят, что это в основном сводится к бесполезности нижней границы («бессмысленной»)
. Я не уверен. Я могу представить их использование, чтобы помочь вам быть более гибкими для вызывающих библиотечный метод, который дает типизированный результат. Представьте себе метод, который создает список массивов указанного пользователем размера и заполняет его пустой строкой. Простое объявление было бы
public static ArrayList createArrayListFullOfEmptyStrings(int i);
Но это излишне ограничивает ваших клиентов. Почему они не могут вызвать ваш метод следующим образом:
//should compile
List
Здесь у меня возникнет соблазн попробовать следующее определение:
public static List createArrayListFullOfEmptyStrings(int size) {
List list = new ArrayList(size);
for(int i = 0; i < size; i++) {
list.add("");
}
return list;
}
Но оно не будет компилироваться; ключевое слово super
недопустимо в этом контексте.
Является ли мой пример выше плохим (игнорируя то, что я говорю ниже)? Почему нет нижняя граница полезна здесь? И если это будет полезно, в чем настоящая причина того, что это не разрешено в Java?
Я знаю, что лучшая организация могла бы быть примерно такой:
public static void populateListWithEmptyStrings(List super String> list, int size);
List list = new ArrayList();
populateListWithEmptyStrings(list, 5);
Можем ли мы для цель этого вопроса состоит в том, чтобы сделать вид, что из-за требования нам нужно выполнять обе операции за один вызов метода?
@Tom G (справедливо) спрашивает, какие преимущества имеют List
будет иметь более List
. Во-первых, никто не сказал, что возвращаемый список неизменяем, поэтому вот одно преимущество:
List l2 = createArrayListFullOfEmptyStrings(5);
l2.add(new StringBuilder("foo").append("bar"));