在以下方面有何区别:
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>的情况下创建方法呢?如果我这样做或不把它说出来,这意味着什么?
发布于 2015-11-17 10:06:45
在第二个方法中,类型参数通常在方法所属的类声明中定义:
class MyClass<T> {
public void createArray(T sample){
ArrayList<T> list = new ArrayList<T>();
list.add(sample);
}
...
}因此,第二个方法属于泛型类型。第一个方法是泛型方法,因为它定义了自己的类型参数。
发布于 2015-11-17 10:06:49
在第一种情况下,为该方法定义了泛型参数T。其他方法可能有不同的T。
在第二种情况下,泛型参数T是为类或接口定义的。该类或接口中的所有方法都必须具有相同的T。
定义类范围的泛型允许您在许多方法上强制使用相同的类型参数。您还可以拥有泛型类型的字段。有关示例,请参见ArrayList<t>。
发布于 2015-11-17 10:22:06
从第二个示例中,我猜想此方法是在泛型类中定义的,如下所示:
class SomeClass<T> {
public void createArray(T sample){ ... }
}第一个示例和第二个示例之间的区别是,在第一个示例中,T实际上是一个“本地”类型变量。您可以给它取一个不同的名称,例如S,以使它更清晰一些:
class SomeClass<T> {
public <S> void createArray(S sample){ ... }
}因此,S和T都是类型变量,但它们是不相关的。T是在类作用域中定义的,因此可以用于在类中的所有方法中引用相同的类型;S仅在方法作用域定义。
通过使用名称T而不是S,您将隐藏类级类型变量T。这意味着,例如,以下内容将不起作用:
class SomeClass<T> {
public T getWotsit() { ... }
public <T> void createArray(T sample){
T wotsit = getWotsit();
}
}因为T在getWotsit的签名中和在变量声明T wotsit中的T可能引用不同的类型;如果您使用名称S来编写等价的代码,这一点就更清楚了:
class SomeClass<T> {
public T getWotsit() { ... }
public <S> void createArray(S sample){
S wotsit = getWotsit();
}
}据我所知,如果定义了同名的方法级类型变量,则无法引用类级类型变量。
不过,以下两项都可以:
class SomeClass<T> {
public T getWotsit() { ... }
// No additional type variable, so T is the class-level type variable.
public void createArray(T sample){
T wotsit = getWotsit();
}
}
class SomeClass<T> {
public T getWotsit() { ... }
// Type variable has different name, so `T` is the class-level
// type variable.
public <S> void createArray(T sample){
T wotsit = getWotsit();
}
}https://stackoverflow.com/questions/33754034
复制相似问题