Удобный автоматический кастинг

Вещь не новая, но для тех, кто начинал программировать на Java в 90-ые и не очень привык к Generics-ам, это может быть интересно.

Пример использования. Вам нужен метод, который возвращает объекты разных классов. Это могут быть обычные объекты – String, Integer, List, а могут быть и какие-то "свои" сложные бизнес-объекты вроде – ABController, XYZComponent, QWERTYHelper, FooManager (название зависит от возраста и предпочтений программиста).

Так писали некоторые до Java 5.

    Helper helper = ....; // Какой-то вспомогательный класс, который хранит всякую ерунду
 
    String  path = (String) helper.get("storage.path");  // да, я знаю, хардкодить константы плохо. 
    Integer maxSize  = (Integer) helper.get("max.size"); 
    MyAwesomeDocumentManager manager = (MyAwesomeDocumentManager) helper.get("manager");

Сейчас можно писать попроще. Конечно это сахар, но код выглядит полегче:

     String  path = helper.get("storage.path");
     Integer maxSize  = helper.get("max.size");
     MyAwesomeDocumentManager manager = helper.get("manager");
 
// То есть вот этого - (String) ... , (Integer) ... и (MyAwesomeDocumentManager) ... не надо :)

Как это делается:

public class Helper {
     public <T> T get(String key) {
         Object result = null;
         // Здесь должа быть спрятана какая-то страшная внутренняя реализация
         // например: result = map.get(key);
          return (T) result;
    }
}

Принципиально ничего не меняется, только кастинг перешел во внутрь.
Если нужен статик, то можно написать так:

public static <T> T get(String key) {
   Object result;
   // опять какая-то страшная логика
   // типа: result = map.get(key);
   return (T) result;
}