首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回类型之前的泛型方法java 6 <T>

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

Stack Overflow用户
提问于 2015-11-17 10:02:53
回答 4查看 7.6K关注 0票数 28

在以下方面有何区别:

代码语言:javascript
复制
public <T> void createArray(T sample){
    ArrayList<T> list = new ArrayList<T>();
    list.add(sample);
}

代码语言:javascript
复制
public void createArray(T sample){
    ArrayList<T> list = new ArrayList<T>();
    list.add(sample);
}

我看到使用类型的方法签名应该在返回类型之前有<T>,但是为什么我仍然能够在没有<T>的情况下创建方法呢?如果我这样做或不把它说出来,这意味着什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-11-17 10:06:45

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

代码语言:javascript
复制
class MyClass<T> {
   public void createArray(T sample){
      ArrayList<T> list = new ArrayList<T>();
      list.add(sample);
   }
   ...
}

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

票数 32
EN

Stack Overflow用户

发布于 2015-11-17 10:06:49

在第一种情况下,为该方法定义了泛型参数T。其他方法可能有不同的T

在第二种情况下,泛型参数T是为类或接口定义的。该类或接口中的所有方法都必须具有相同的T

定义类范围的泛型允许您在许多方法上强制使用相同的类型参数。您还可以拥有泛型类型的字段。有关示例,请参见ArrayList<t>

票数 13
EN

Stack Overflow用户

发布于 2015-11-17 10:22:06

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

代码语言:javascript
复制
class SomeClass<T> {
  public void createArray(T sample){ ... }
}

第一个示例和第二个示例之间的区别是,在第一个示例中,T实际上是一个“本地”类型变量。您可以给它取一个不同的名称,例如S,以使它更清晰一些:

代码语言:javascript
复制
class SomeClass<T> {
  public <S> void createArray(S sample){ ... }
}

因此,ST都是类型变量,但它们是不相关的。T是在类作用域中定义的,因此可以用于在类中的所有方法中引用相同的类型;S仅在方法作用域定义。

通过使用名称T而不是S,您将隐藏类级类型变量T。这意味着,例如,以下内容将不起作用:

代码语言:javascript
复制
class SomeClass<T> {
  public T getWotsit() { ... }
  public <T> void createArray(T sample){
    T wotsit = getWotsit();
  }
}

因为TgetWotsit的签名中和在变量声明T wotsit中的T可能引用不同的类型;如果您使用名称S来编写等价的代码,这一点就更清楚了:

代码语言:javascript
复制
class SomeClass<T> {
  public T getWotsit() { ... }
  public <S> void createArray(S sample){
    S wotsit = getWotsit();
  }
}

据我所知,如果定义了同名的方法级类型变量,则无法引用类级类型变量。

不过,以下两项都可以:

代码语言:javascript
复制
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();
  }
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33754034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档