以下两者的区别是什么:
public <T> void createArray(T sample){
ArrayList<T> list = new ArrayList<T>();
list.add(sample);
}
和
public void createArray(T sample){
ArrayList<T> list = new ArrayList<T>();
list.add(sample);
}
我读到用于使用类型的方法签名应该在返回类型之前有<T>
,但为什么我仍然能够创建没有<T>
的方法?如果我这样做或不这样做,意味着什么?
4条答案
按热度按时间kkih6yb81#
在第二种方法中,类型参数通常在该方法所属的类声明中定义:
因此,第二个方法属于泛型类型。第一个方法是泛型方法,因为它定义了自己的类型参数。
doinxwow2#
在第一种情况下,为方法定义了泛型参数
T
。其他方法可能具有不同的T
。在第二种情况下,为类或接口定义了泛型参数
T
。该类或接口中的所有方法必须具有相同的T
。定义类范围的泛型允许您在许多方法上强制使用相同的类型参数。您还可以具有泛型类型的字段。有关示例,请参见
ArrayList<t>
。w8f9ii693#
从第二个例子中,我猜这个方法是在一个泛型类中定义的,如下所示:
第一个和第二个示例的区别在于,在第一个示例中,
T
实际上是一个“局部”类型变量。你可以给它一个不同的名字,例如S
,以使它更清晰:因此,
S
和T
都是类型变量,但不相关。T
是在类范围内定义的,因此可以用于在类中的所有方法中引用相同的类型;S
仅在方法范围内定义。通过使用名称
T
而不是S
,您隐藏了类级别类型变量T
。这意味着,例如,以下内容将不起作用:因为
getWotsit
的签名中的T
和变量声明T wotsit
中的mn11o1p可能引用不同的类型;如果使用名称S
来编写等效代码,这一点就更清楚了:据我所知,如果定义了同名的方法级类型变量,则无法引用类级类型变量。
但是,以下两项都可以:
ma8fv8wu4#
对于
public void createArray(T sample)
,其中T
在类定义中定义,MyClass<T>
是类的泛型对于
public <T> void createArray(T sample){
,T
是方法的局部泛型,与MyClass<T>
中的T
无关,该T
可以是任何X、Y、Z。如果在void之前移除<T>
,则它现在是MyClass<T>
中的<T>
并且不能是X、Y、Z