Разница здесь в том, что в первом мы указываем, что вызывающая сторона должна передать экземпляр объекта (любой класс), и он вернет другой объект (любой класс, не обязательно того же типа).
Во втором случае возвращаемый тип будет того же типа, который был указан при определении класса.
Example ex = new Example<Integer>();
Здесь мы указываем, каким будет тип T, который позволит нам наложить больше ограничений на класс или метод.Например, мы можем создать экземпляр LinkedList<Integer>
или LinkedList<Example>
и знаем, что при вызове одного из этих методов мы получим экземпляр типа Integer или Example.
Основная цель здесь заключается в том, чтобы вызывающийКод может указывать, на какой тип объектов будет работать класс, вместо того чтобы полагаться на приведение типов.
См. Обобщение Java * от Oracle.
*Обновленная ссылка.