Из-за стирания типа оба метода практически одинаковы.
Такой шаблон будет полезен, только если вы return
извлекаете экземпляр T
из метода. Простым примером будет приведение объекта, хранящегося где-то, к ожидаемому типу (это небезопасно, поскольку мы не проверяем, действительно ли это и является экземпляром T
, но это другая история)
public static <T extends SomeClass> T get(String name) {
return (T) fancyLookup(name)
}
private static Object fancyLookup(String name) { ... }
Итак, чтобы ответить на ваш вопрос:
В чем различия между ними?
Ничего, во время выполнения они эффективно идентичны.
Когда я должен использовать каждый?
Предпочитайте тот, у которого нет универсальных шаблонов, поскольку они одинаковы, и введение универсального кода там, где ничего не нужно, только усложняет ваш код.