Разница здесь в том, что в первом мы указываем, что вызывающий должен передать экземпляр объекта (любой класс), и он вернет другой объект (любой класс, не обязательно того же типа).
Во втором случае возвращаемый тип будет того же типа, что и при определении класса.
Example ex = new Example<Integer>();
Здесь мы указываем, какой будет тип T, что позволяет нам наложить больше ограничений на класс или метод. Например, мы можем создать экземпляр LinkedList<Integer>
или LinkedList<Example>
и знаем, что когда мы вызываем один из этих методов, мы возвращаем экземпляр Integer или Example.
Основная цель здесь состоит в том, что вызывающий код может указывать, с каким типом объектов будет работать класс, вместо того, чтобы полагаться на приведение типов для обеспечения этого.
См. Java Generics * от Oracle.
* Обновлена ссылка.
Вам не нужно выполнять дополнительное приведение классов. В первом случае вы всегда получите объект класса java.lang.Object, который вам нужно будет преобразовать в свой класс. Во втором случае T будет заменен классом, определенным в универсальной сигнатуре, и преобразование классов не потребуется.
источник
Во время выполнения ничего. Но во время компиляции второй будет выполнять проверку типа, чтобы убедиться, что тип параметра и тип возвращаемого значения совпадают (или являются подтипами) любого типа T (первый пример также выполняет проверку типа, но каждый объект является подтип объекта, поэтому будут приняты все типы).
источник
T - универсальный тип. Это означает, что он может быть заменен любым подходящим объектом во время выполнения. Вы можете вызвать такой метод следующим образом:
String response = doSomething("hello world");
ИЛИ
MyObject response = doSomething(new MyObject());
ИЛИ
Integer response = doSomething(31);
Как видите, здесь есть полиморфизм.
Но если объявлено, что он возвращает Object, вы не сможете этого сделать, если не наберете cast.
источник
<T>
автобоксом нет?в первом случае он принимает параметр любого типа egstring и возвращает тип foo. Во втором случае он принимает параметр типа foo и возвращает объект типа foo.
источник
Есть несколько причин, по которым вы можете рассматривать Generics over Object в Java:
источник