Hvad betyder <T forlænger?
Det kaldes en generisk metode. Hele dette koncept kaldes "Generics" i Java. Denne erklæring betyder, at T kan være enhver type, der er underklasse af ABC.
Afgrænsede typeparametre:
Der kan være tidspunkter, hvor du ønsker at begrænse den type typer, der må overføres til en typeparameter. For eksempel vil en metode, der opererer på tal, måske kun acceptere forekomster af Number eller dets underklasser. Dette er, hvad afgrænsede type parametre er til.
For at erklære en afgrænset typeparameter skal du angive typeparameterens navn efterfulgt af nøgleordet extends efterfulgt af dens øvre grænse.Eksempel:
Følgende eksempel illustrerer, hvordan udvider bruges i generel betydning til at betyde enten "udvider" (som i klasser) eller "implementerer" (som i grænseflader). Dette eksempel er en generisk metode til at returnere det største af tre sammenlignelige objekter:
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" ) );
}
}
Det betyder, at du skal send en ABC
objekt eller et underordnet ABC
, ingen andre klasser tilladt. Også din Acd
variabel kunne bruge metoderne i ABC
klasse, der er synlige for klassen, der indeholder save
metode.
Dette er nyttigt, når din T
klasse udvider grænseflader. For eksempel opretter du en klasse, der håndterer sortering af objektmatrix, og denne klasse skal implementer tne Comparable
interface, ellers vil arrayet ikke være tilladt:
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!
}
}