在Java Generics中使用类型参数之前的方法/构造函数

时间:2014-09-14 03:12:32

标签: java generics

我正在学习Java中的泛型,并且在我达到主题之前一直很顺利 - 创建通用方法。

我知道在Java中,当您想要实现某些内容时,无论程序(或方法)操作的数据类型如何,都会使用泛型。因此,您可以将 泛型类 设为Class Gen<T>,然后设置为非泛型类 类GenDemo (包括main())。然后,您可以为不同的数据类型创建Gen references,例如Gen<Integer> iOBGen <String> strOB

但是,在创建泛型方法的示例中,本书提供了以下代码:

//This is a simple generic method

class GenMethDemo
{

   //determine if an object is in an array
   static<T,V extends T> boolean isIn(T x, V[] y)
   {

      for (int i=0; i<y.length; i++)
          if(x.equals(y[i])) 
            return true;
          else
            return false;
   }

public static void main(String[] args)
  {
   //use isIn() on Integers
   Integer nums[]={1,2,3,4,5};

   if(isIn(2,nums))
   System.out.println("2 is in nums");

   if(!isIn(7,nums))
   System.out.println("2 is in nums");

   //use isIn() on Strings
   String strs[]={"one", "two", "three", "four", "five"};

   if(!(isIn("two", strs))
   System.out.println("two is in strs");

  }
}

据我所知,该程序正在尝试确定给定数组是否包含指定对象。但我无法绕过这条线:

static <T,V extends T> boolean isIn(T x, V[] y)

根据我在仿制药中研究的内容,我知道布尔函数isIn()有两个参数。但是在函数<T, V extends T>的返回类型之前, 类型参数 isIn()做了什么?

我理解在这里使用关键字 extends ;它充当类型参数 V的绑定,即:V必须与T的类型或T的子类相同,但我无法进一步

在主题下有类似参数的使用: 创建通用构造函数 ,如下:

class GenCons
    {
       private double val;

       <T extends Number> GenCons(T arg)
          {
             val=arg.doubleValue();
          }

        void showVal()
          {
            System.out.println("Val: "+ val); 
          }

    }

和以前一样,我对这句话感到困惑:<T extends Number> GenCons(T arg)。为什么在声明构造函数之前使用<T extends Number>?它也可以写成:GenCons(<T extends Number> arg)

任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:0)

请注意,在GenMethDemoGenCons类中,类本身并不具有泛型类型。它不是class GenMethDemo<T, V extends T> - 相反,它只是class GenMethDemo

因此,如果GenMethDemoGenCons不是通用类,那么您如何使用泛型?这似乎是一个矛盾。

嗯,Java还允许您定义泛型方法。如果我static<T,V extends T> boolean isIn(T x, V[] y),那就好像我实际完成了class GenMethDemo<T, V extends T>,除了类型变量TV仅限于该特定方法。当您不希望整个班级使用泛型时,这可能很有用;只有他们真正需要的一两种方法。