Про обобщения (generics)

Чем такой формат объявления метода

<T extends Number> double sum(Collection<T> c ) {...}

отличен от

double sum2(Collection<? extends Number> c ) {...}    

если в итоге результат не отличается ? что лучше использовать и почему ?


Ответы (1 шт):

Автор решения: Pentiux

Это две принципиально разные вещи. В первом случае, ты говоришь, что в следующем блоке у тебя будет общий дженерик (тип который будет подставляться в зависимости от обращения).

    class OurClass<T> {
        void someFun(T a, T b) {
            System.out.println(a + b);
        }
    }
public class MainClass {
    public static void main(String[] args) {
        OurClass<String> stringObject = new OurClass<>();
        OurClass<Int> intObject = new OurClass<>();
        stringObject.someFun("asd", "qwe"); //вывод asdqwe
        intObject.someFun(1,2); //вывод 12
    }
}

Во втором же, просто обозначаешь с каким типом данных будет работать Collection потому что в ее реализации как раз и используются дженерики.

Update из комментариев:
Ок. Когда мы что-то пишем в коде, то мы обозначаем свои намерения. Если мы объявляем класс, а внутри него просто делаем только статическую переменную, то это выглядит странно и не понятно. Так же и с дженериками. Если мы хотим сказать, что в этом месте будет использоваться общий для данных тип, то мы используем обобщение. Если же мы хотим просто определить тип, который используется в конкретной реализации, то делаем именно это. Отсюда и выбор того, что лучше.

→ Ссылка