Я видел метод, как показано ниже:
protected <T extends ABC> T save( T Acd, boolean en) {
Что он делает? Что это за типы объявлений, называемых Java?
Я видел метод, как показано ниже:
protected <T extends ABC> T save( T Acd, boolean en) {
Что он делает? Что это за типы объявлений, называемых Java?
Он называется общим методом. Вся эта концепция называется "Generics" в Java. Это объявление означает, что T может быть любым типом, который является подклассом ABC.
Параметры ограниченного типа:
Бывают случаи, когда вы захотите ограничить типы типов, которым разрешено передавать параметр типа. Например, метод, который работает с числами, может только принимать экземпляры Number или его подклассов. Для этого используются параметры ограниченного типа.
Чтобы объявить параметр ограниченного типа, перечислите имя параметра типа, за которым следует ключевое слово extends, а затем его верхняя граница. Пример:
В следующем примере показано, как extends используется в общем смысле для обозначения либо "расширяется" (как в классах), либо "реализует" (как в интерфейсах). Этот пример - это метод Generic для возврата самого большого из трех объектов Comparable:
public class MaximumTest
{
// determines the largest of three Comparable objects
public static <T extends Comparable<T>> T maximum(T x, T y, T z)
{
T max = x; // assume x is initially the largest
if ( y.compareTo( max ) > 0 ){
max = y; // y is the largest so far
}
if ( z.compareTo( max ) > 0 ){
max = z; // z is the largest now
}
return max; // returns the largest object
}
public static void main( String args[] )
{
System.out.printf( "Max of %d, %d and %d is %d\n\n",
3, 4, 5, maximum( 3, 4, 5 ) );
System.out.printf( "Maxm of %.1f,%.1f and %.1f is %.1f\n\n",
6.6, 8.8, 7.7, maximum( 6.6, 8.8, 7.7 ) );
System.out.printf( "Max of %s, %s and %s is %s\n","pear",
"apple", "orange", maximum( "pear", "apple", "orange" ) );
}
}
Это означает, что вы должны отправлять объект ABC
или дочерний элемент ABC
, другие классы не разрешены. Кроме того, ваша переменная Acd
может использовать методы класса ABC
, которые видны классу, который поддерживает метод save
.
Это полезно, если класс T
расширяет интерфейсы. Например, вы создаете класс, который обрабатывает сортировку массива объектов, а этот класс должен реализовывать интерфейс Comparable
, иначе массив не будет разрешен:
class Class1 implements Comparable<Class1> {
//attributes, getters and setters...
int x;
//implementing the interface...
public int compareTo(Class1 c1) {
//nice implementation of compareTo
return (this.x > c1.x)? 1 : (this.x < c1.x) ? 0 : -1;
}
}
class Class2 {
int x;
}
public class Sorter<T extends Comparable<T>> {
public static void insertionSort(T[] array) {
//good implementation of insertion sort goes here...
//just to prove that you can use the methods of the Comparable interface...
array[0].compareTo(array[1]);
}
public static void main(String[] args) {
Class1[] arrC1 = new Class1[5];
Class2[] arrC2 = new Class2[5];
//fill the arrays...
insertionSort(arrC1); //good!
insertionSort(arrC2); //compiler error!
}
}
Это save method
, который исключает параметр T и логический тип, где T должно быть ограничено верхним классом ABC. Класс ABC или любой подкласс будут приняты.
Это называется дженерики в Java.
В двух словах, дженерики позволяют типам (классам и интерфейсам) быть параметрами при определении классов, интерфейсов и методов. Подобно более знакомым формальным параметрам, используемым в объявлениях методов, параметры типа предоставляют вам возможность повторно использовать один и тот же код с разными входами. Разница в том, что входные данные для формальных параметров являются значениями, а входные данные для параметров типа являются типами.
Неофициально:
Строго типизированные языки, такие как Java, вызывают больше ошибок во время компиляции, а не во время выполнения. Это хорошая вещь. Но это вызывает дублирование кода. Для смягчения этого дженерики был добавлен в Java.
Это дженерики. Дженерики с типом Bounds!
protected <T extends ABC> T save( T Acd, boolean en) {
// ...
}
В этой функции есть два места, на которые мы должны обратить внимание
<T extends ABC>
T
Исходя из этого, я могу ответить на ваши вопросы следующим образом
Что оно делает?
save()
- это универсальный метод, который возвращает значение типа T
T
является универсальным типом, который ограничен ABC
. Область действия T
ограничена save()
.
Как эти типы объявлений методов называются в Java?
ИМО, ответом должны быть параметры ограниченного типа, а не обобщенные. Больше о дженериках в Java вы можете найти здесь.
Еще один вопрос, который я хотел бы добавить сам: зачем нам такая вещь?
Могут быть случаи, когда вы хотите ограничить типы, которые можно использовать в качестве аргументов типа в параметризованном типе. Например, метод, который работает с числами, может хотеть принимать только экземпляры Number или его подклассов. Это то, что параметры ограниченного типа для [1].