51

我见过如下所示的方法:

protected <T extends ABC> T save( T Acd, boolean en) {

它有什么作用?这些在 Java 中调用的方法声明类型是什么?


这意味着您必须发送一个ABC对象或 的孩子ABC,不允许其他类。此外,您的Acd变量可以使用包含该方法的ABC类可见的类中的save方法。

T当您的类扩展接口时,这很有用。例如,您正在创建一个处理对象数组排序的类,并且该类必须实现 tneComparable接口,否则将不允许该数组:

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

7 回答 7

46

它被称为泛型方法。这整个概念在 Java 中称为“泛型”。该声明意味着 T 可以是任何类型的 ABC 的子类。

于 2012-10-17T06:31:20.520 回答
19

有界类型参数:

有时您可能想要限制允许传递给类型参数的类型种类。例如,对数字进行操作的方法可能只想接受 Number 或其子类的实例。这就是有界类型参数的用途。

要声明有界类型参数,请列出类型参数的名称,后跟 extends 关键字,然后是其上限。例子:

以下示例说明了如何在一般意义上使用扩展来表示“扩展”(如在类中)或“实现”(如在接口中)。此示例是返回三个 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" ) );
   }
}
于 2012-10-17T06:53:25.993 回答
4

这是一个generic保存方法,它除了参数 T 和布尔类型,其中 T 必须是 ABC 类的上限。ABC类或任何子类将被接受。

于 2012-10-17T06:32:09.787 回答
4
protected <T extends ABC> T save( T Acd, boolean en) {
    // ...
}

在这个函数中,有两个地方需要注意

  • 有界类型参数<T extends ABC>
  • 返回类型T

基于这些,我可以回答您的问题如下

它有什么作用?

save()是返回类型值的泛型方法TT是泛型类型,仅限于ABC. 的范围T仅限于save()

这些在 Java 中调用的方法声明类型是什么?

IMO,答案应该是有界类型参数,而不是泛型有关 Java 中的泛型的更多信息,您可以在此处找到。

我想自己补充一个问题:为什么我们想要这样的东西?

有时您可能想要限制可用作参数化类型中的类型参数的类型。例如,对数字进行操作的方法可能只想接受 Number 或其子类的实例。这就是[1]的有界类型参数。

于 2019-05-22T10:05:30.740 回答
3

这是泛型。具有类型边界的泛型!

请参阅此处以供参考

于 2012-10-17T06:31:38.680 回答
3

这在 Java 中称为泛型。

官方解释

简而言之,泛型使类型(类和接口)在定义类、接口和方法时成为参数。就像在方法声明中使用的更熟悉的形式参数一样,类型参数为您提供了一种通过不同输入重用相同代码的方法。区别在于形式参数的输入是值,而类型参数的输入是类型。

非正式地:

像 Java 这样的强类型语言会导致更多错误出现在编译时而不是运行时。这是一件好事。但它会导致代码重复。为了缓解这种情况,Java 中添加了泛型。

于 2016-06-10T15:42:50.770 回答
3

这意味着您必须发送一个ABC对象或 的孩子ABC,不允许其他类。此外,您的Acd变量可以使用包含该方法的ABC类可见的类中的save方法。

T当您的类扩展接口时,这很有用。例如,您正在创建一个处理对象数组排序的类,并且该类必须实现 tneComparable接口,否则将不允许该数组:

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!
    }
}
于 2012-10-17T06:30:50.170 回答