返回类型之前的泛型方法java 6<T>

jjjwad0x  于 2022-10-22  发布在  Java
关注(0)|答案(4)|浏览(194)

以下两者的区别是什么:

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>的方法?如果我这样做或不这样做,意味着什么?

kkih6yb8

kkih6yb81#

在第二种方法中,类型参数通常在该方法所属的类声明中定义:

class MyClass<T> {
   public void createArray(T sample){
      ArrayList<T> list = new ArrayList<T>();
      list.add(sample);
   }
   ...
}

因此,第二个方法属于泛型类型。第一个方法是泛型方法,因为它定义了自己的类型参数。

doinxwow

doinxwow2#

在第一种情况下,为方法定义了泛型参数T。其他方法可能具有不同的T
在第二种情况下,为类或接口定义了泛型参数T。该类或接口中的所有方法必须具有相同的T
定义类范围的泛型允许您在许多方法上强制使用相同的类型参数。您还可以具有泛型类型的字段。有关示例,请参见ArrayList<t>

w8f9ii69

w8f9ii693#

从第二个例子中,我猜这个方法是在一个泛型类中定义的,如下所示:

class SomeClass<T> {
  public void createArray(T sample){ ... }
}

第一个和第二个示例的区别在于,在第一个示例中,T实际上是一个“局部”类型变量。你可以给它一个不同的名字,例如S,以使它更清晰:

class SomeClass<T> {
  public <S> void createArray(S sample){ ... }
}

因此,ST都是类型变量,但不相关。T是在类范围内定义的,因此可以用于在类中的所有方法中引用相同的类型;S仅在方法范围内定义。
通过使用名称T而不是S,您隐藏了类级别类型变量T。这意味着,例如,以下内容将不起作用:

class SomeClass<T> {
  public T getWotsit() { ... }
  public <T> void createArray(T sample){
    T wotsit = getWotsit();
  }
}

因为getWotsit的签名中的T和变量声明T wotsit中的mn11o1p可能引用不同的类型;如果使用名称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();
  }
}
ma8fv8wu

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

相关问题