Parametry typów - lower bounded

0

Cześć, wykonywałem ćwiczenie nr 8 z tutoriala Oracle i nie do końca rozumiem to co wytłuściłem <T extends Object & Comparable<? **super **T>>. Czy mógłby ktoś pomóc mi to zrozumieć ?

import java.util.*;
public class Main {

	public static <T **extends Object** & Comparable<? **super **T>> T
			maximum(List<? extends T> list, long begin, long end) {

        return list.stream().skip(begin).limit(end).
				max((o1, o2) -> o1.compareTo(o2)).get();
	}

	public static void main(String... args) {
		List<Integer> list = new ArrayList<>();

		for(int i = 0 ; i < 10 ; i++)
			list.add(i);
		System.out.println(maximum(list, 0, list.size()));
	}
}
0

Ten fragment <T extends Object & Comparable<? super T>> deklaracji metody nakłada ograniczenia na typ T. T extends Object oznacza, że T jest podtypem Object, a T extends Comparable<? super T> oznacza, że T jest podtypem Comparable<? super T>. & oznacza, że interesuje nas część wspólna tych ograniczeń.

W przypadku wykonywania type erasure zawsze brane pod uwagę jest pierwsze ograniczenie. Tutaj jest to T extends Object, bo chcemy żeby T został zastąpiony przez Object, a nie Comparable (chodzi o to żeby metoda sparametryzowana zachowywała się tak samo jak metoda napisana bez parametrów - żeby mogła współdziałać z kodem napisanym przed Java 5).

Drugie ograniczenie to T extends Comparable<? super T>, bo chcemy pozwolić na porównywanie elementów typu T według porządku ustanowionego dla nadtypu T.

0

Akurat trochę tam zrobili overengineering bo w 99% przypadków starczyłoby public static <T extends Comparable<T>> T max(List<T> list, int begin, int end) bo te wildcardy nijak tam w niczym nie pomogą w normalnym kodzie.

0

Dzięki za pomoc

1 użytkowników online, w tym zalogowanych: 0, gości: 1