Параметр типа <T>
был добавлен к java.lang.Class
, чтобы включить одну конкретную идиому 1 - использование Class
объектов в качестве фабрики объектобезопасных объектов.По сути, добавление <T>
позволяет создавать экземпляры классов безопасным для типов образом, например так:
T instance = myClass.newInstance();
Параметр типа <T>
представляет сам класс, что позволяет избежать неприятных последствий удаления типасохраняя Class<T>
в универсальном классе или передавая его в качестве параметра универсальному методу.Обратите внимание, что T
само по себе недостаточно для выполнения этой задачи 2 : тип T
стирается, поэтому он становится java.lang.Object
под капотом.
Здеськлассический пример, где <T>
параметр класса становится важным.В приведенном ниже примере компилятор Java способен обеспечить безопасность типов, позволяя создавать типизированную коллекцию из строки SQL и экземпляра Class<T>
.Обратите внимание, что класс используется как factory , и что его безопасность типов может быть проверена во время компиляции:
public static <T> Collection<T> select(Class<T> c, String sqlStatement) {
Collection<T> result = new ArrayList<T>();
/* run sql query using jdbc */
for ( /* iterate over jdbc results */ ) {
T item = c.newInstance();
/* use reflection and set all of item’s fields from sql results */
result.add(item);
}
return result;
}
Поскольку Java стирает параметр типа, делая его java.lang.Object
или класс, указанный как универсальная верхняя граница , важно иметь доступ к объекту Class<T>
внутри метода select
.Поскольку newInstance
возвращает объект типа <T>
, компилятор может выполнять проверку типа, исключая приведение.
1 СОЛНЦЕ Oracle опубликовала хорошую статью, объясняющую все это .
2 Это отличается от реализаций обобщений без стирания типаНапример, один в .NET.
3 Учебник по Java Generics от Oracle.