powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Убивает синтаскис объявления generic метода (найти max элемент списка и вернуть его)
5 сообщений из 5, страница 1 из 1
Убивает синтаскис объявления generic метода (найти max элемент списка и вернуть его)
    #38404246
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.

Читаю офиц. trail по генерикам.
Сижу в тихом ужосе, конечно: нормальный чел такой запутанный синтаксис выдумать не мог. Это паранойя какая-то.
Ладно, это лирика была. Теперь вопрос из раздела упражнений.
http://docs.oracle.com/javase/tutorial/java/generics/QandE/generics-questions.html Write a generic method to find the maximal element in the range [begin, end) of a list.
Вот решение с "официальным" вариантом и то, что у меня родилось (адаптированное по именам переменных под "официальный" вариант и специально переделанное под поиск min -элемента):
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
import java.util.*;
class GenTest01 {
  static List<Integer> n = new ArrayList<Integer>( Arrays.asList(new Integer[] {9,1,4,7,7,3,2,-1,7,5,-9,1,2}) );
  public static void main(String[] args) {
    System.out.println( "min="+GenTest01.findMin( n, 2, 8 )+", max="+GenTest01.findMax( n, 2, 8 ) );
  }

  // "Write a generic method to find the maximal element of a list."

  // 1. Official doc:
  static <T extends Object & Comparable<? super T>>
  T findMax(List <? extends T> x, int begin, int end) {

    T maxElem=x.get(begin);

    for (++begin; begin < end; ++begin)
            if (maxElem.compareTo(x.get(begin)) < 0)
                maxElem = x.get(begin);
    return maxElem;
  }

  // 2. My own:
  static < T extends Object & Comparable > // ==>
  //  static < T extends Object & Comparable<T> >
  T findMin(List <T> x, int begin, int end) {
    T minElem=x.get(begin);

    for (++begin; begin < end; ++begin)
            if (minElem.compareTo(x.get(begin)) > 0)
                minElem = x.get(begin);
    return minElem;
  }
}


Из-за того, что параметр метода "2. My own" объявлен как
Код: java
1.
< T extends Object & Comparable >

- а не:
Код: java
1.
static < T extends Object & Comparable<T> >

- получаю предупреждение от компилятора:
Код: plaintext
1.
2.
GenTest01.java:28: warning: [unchecked] unchecked call to compareTo(T) as a member of the raw type java.lang.Comparable
            if (minElem.compareTo(x.get(begin)) > 0)
                                 ^

Вопросов тут несколько.
1. Почему он не в состоянии понять, что если minElem имеет тип `T`, входной список (x) содержит элементы того же типа `T`, то сравнение двух величин: minElem.compareTo(x.get(begin)) не может выдать исключение рантайма ? (или всё-таки может ?!)

2. Предупреждение исчезает, как только я добавлю эту `T` еще один раз:
Код: java
1.
  static < T extends Object & Comparable<T> >

Тогда к чему относится первая из указанных тут `T`, которая слева отслова 'extends' ??

3. В офиц. варианте объявление всё равно не такое, а еще более навороченное:
Код: java
1.
static <T extends Object & Comparable<? super T>>

Не понимаю тут следующее: для чего здесь этот "? super T" (смысл его знаю; для чего он ТУТ применён - не врубаюсь, т.к. не могу понять, что передать моему варианту, чтобы он завалился, а этот - нет).

ЗЫ. И еще. Где-нить есть толковое и ВМЕНЯЕМОЕ ководство по генерикам ? Не просто чтобы "запомните правило: если ***, то надо ***, а иначе ***" - а чтобы с объяснением, ПОЧЕМУ надо писать именно так, а не эдак ? Официальный трейл осилить не могу. Впервые, наверное :(
...
Рейтинг: 0 / 0
Убивает синтаскис объявления generic метода (найти max элемент списка и вернуть его)
    #38404285
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ozzmosis3. В офиц. варианте объявление всё равно не такое, а еще более навороченное:
Код: java
1.
static <T extends Object & Comparable<? super T>>


Не понимаю тут следующее: для чего здесь этот "? super T" (смысл его знаю; для чего он ТУТ применён - не врубаюсь, т.к. не могу понять, что передать моему варианту, чтобы он завалился, а этот - нет). http://www.angelikalanger.com/GenericsFAQ/FAQSections/TypeArguments.html#FAQ103 A wildcard with either an upper or a lower bound.
A wildcard with an upper bound looks like " ? extends Type " and stands for the family of all types that are subtypes of Type , type Type being included. Type is called the upper bound .
A wildcard with a lower bound looks like " ? super Type " and stands for the family of all types that are supertypes of Type , type Type being included. Type is called the lower bound .

Bounded wildcards are used as arguments for instantiation of generic types. Bounded wildcards are useful in situations where only partial knowledge about the type argument of a parameterized type is needed, but where unbounded wildcards carry too little type information.

Example:


Код: java
1.
2.
3.
4.
5.
6.
7.
public class Collections { 
  public static <T> void copy  
  ( List<? super T> dest, List<? extends T> src) {  // bounded wildcard parameterized types 
      for (int i=0; i<src.size(); i++) 
        dest.set(i,src.get(i)); 
  } 
}


The copy method copies elements from a source list into a destination list. The destination list must be capable of holding the elements from the source list. We express this by means of bounded wildcards: the output list is required to have an element type with a lower bound T and the input list must have an element type with an upper bound T .
...
Рейтинг: 0 / 0
Убивает синтаскис объявления generic метода (найти max элемент списка и вернуть его)
    #38404455
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ozzmosis,ЗЫ. И еще. Где-нить есть толковое и ВМЕНЯЕМОЕ ководство по генерикам ? Не просто чтобы "запомните правило: если ***, то надо ***, а иначе ***" - а чтобы с объяснением, ПОЧЕМУ надо писать именно так, а не эдак ?
У Анжелики все есть, а в книге Thinking in Java в разделе генериков разжевано почему все так как есть.
...
Рейтинг: 0 / 0
Убивает синтаскис объявления generic метода (найти max элемент списка и вернуть его)
    #38404535
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ozzmosis,

? super T нужен для тех случаев когда A implements Comparable<A>, а то что попадает в T - extends A
...
Рейтинг: 0 / 0
Убивает синтаскис объявления generic метода (найти max элемент списка и вернуть его)
    #38404562
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2all: спасибо. буду дальше копать.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Убивает синтаскис объявления generic метода (найти max элемент списка и вернуть его)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]