Почему параметр типа Java не может иметь более низкий bound?

Я так понимаю, вы не можете привязать параметр типа Java generics к нижней границе (то есть с помощью ключевого слова super ). Я читал то, что было сказано в FAQ Angelika Langer Generics по этой теме . Они говорят, что это в основном сводится к бесполезности нижней границы («бессмысленной»)

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

public static ArrayList createArrayListFullOfEmptyStrings(int i);

Но это излишне ограничивает ваших клиентов. Почему они не могут вызвать ваш метод следующим образом:

//should compile
List l1 = createArrayListFullOfEmptyStrings(5); 
List l2 = createArrayListFullOfEmptyStrings(5);
List l3 = createArrayListFullOfEmptyStrings(5);

//shouldn't compile
List l4 = createArrayListFullOfEmptyStrings(5);

Здесь у меня возникнет соблазн попробовать следующее определение:

public static  List createArrayListFullOfEmptyStrings(int size) {
  List list = new ArrayList(size);
  for(int i = 0; i < size; i++) {
     list.add("");
  }
  return list;
}

Но оно не будет компилироваться; ключевое слово super недопустимо в этом контексте.

Является ли мой пример выше плохим (игнорируя то, что я говорю ниже)? Почему нет нижняя граница полезна здесь? И если это будет полезно, в чем настоящая причина того, что это не разрешено в Java?

PS

Я знаю, что лучшая организация могла бы быть примерно такой:

public static void populateListWithEmptyStrings(List list, int size);

List list = new ArrayList();
populateListWithEmptyStrings(list, 5);

Можем ли мы для цель этого вопроса состоит в том, чтобы сделать вид, что из-за требования нам нужно выполнять обе операции за один вызов метода?

Edit

@Tom G (справедливо) спрашивает, какие преимущества имеют List будет иметь более List . Во-первых, никто не сказал, что возвращаемый список неизменяем, поэтому вот одно преимущество:

List l2 = createArrayListFullOfEmptyStrings(5);
l2.add(new StringBuilder("foo").append("bar"));

48
задан Mark Peters 16 February 2011 в 14:49
поделиться