Java >> Java tutorial >  >> Tag >> extends

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!
    }
}

Java tag