我正在学习Java中的泛型,并且在我达到主题之前一直很顺利 - 创建通用方法。
我知道在Java中,当您想要实现某些内容时,无论程序(或方法)操作的数据类型如何,都会使用泛型。因此,您可以将 泛型类 设为Class Gen<T>
,然后设置为非泛型类 类GenDemo (包括main()
)。然后,您可以为不同的数据类型创建Gen references
,例如Gen<Integer> iOB
和Gen <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)
?
任何帮助都将受到高度赞赏。
答案 0 :(得分:0)
请注意,在GenMethDemo
和GenCons
类中,类本身并不具有泛型类型。它不是class GenMethDemo<T, V extends T>
- 相反,它只是class GenMethDemo
。
因此,如果GenMethDemo
和GenCons
不是通用类,那么您如何使用泛型?这似乎是一个矛盾。
嗯,Java还允许您定义泛型方法。如果我static<T,V extends T> boolean isIn(T x, V[] y)
,那就好像我实际完成了class GenMethDemo<T, V extends T>
,除了类型变量T
和V
仅限于该特定方法。当您不希望整个班级使用泛型时,这可能很有用;只有他们真正需要的一两种方法。