public <T> void run(T object){}是什么意思?

拉胡尔·库鲁普(Rahul Kurup)

我正在阅读泛型并尝试编写以下代码。没有编译错误。

import java.util.*;

public class JavaApplication14 {

    public<T>  void run (T obj ) {
        //Do Something
    }

  public static void main(String[] args) {     
      JavaApplication14  m= new JavaApplication14();
      m.run(new ArrayList<>());  
      m.run(new Interger(5);
      m.run(5);
     }
}

如果功能是

 public<T extends Number>  void run (T obj) {
            //Do Something
        }

这很有意义,因为我们可以将此函数的参数限制为Number及其子类型。但是,让函数“运行”是什么却没有任何束缚的意思却感到非常困惑?现在可以将任何对象作为参数了吗?在什么情况下我需要对泛型使用此类功能?

达马克

您可能会感到困惑的部分原因是,run在这种情况下使用通用方法毫无意义通常,您可以使用类型参数来创建两个参数类型之间和/或参数类型与返回类型之间的关系。在您的示例中,run也可能已被声明为需要Object参数(没有声明边界的类型参数实际上具有Object其边界)。

我知道有一种情况,您可能会在单个参数类型中有用地使用类型参数:当您希望能够以一种不依赖元素类型的方式来操作集合,但确实需要插入元素时进入收藏。考虑一个假设的“反向列表”方法:

<T> void reverse(List<T> list)
{
    List<T> reversed = new ArrayList<T>();
    for (int i = list.size(); i > 0; i--) {
        reversed.add(list.get(i - 1));
    }
    list.clear();
    list.addAll(reversed);
}

以不需要类型参数的方式(即采用List<?>参数)来编写此代码将很困难没有强制转换的唯一方法是:

void reverse2(List<?> list)
{
    reverse(list);  // call reverse as defined above!
}

但是同样,这不适用于您讨论的示例。

因此,总而言之:

没有显式边界的类型参数有效地具有Object边界。

方法可能需要类型参数(有或没有显式绑定)的原因有两个:

  • 指定参数类型和/或返回类型之间的关系
  • 捕获潜在的通配符作为类型参数,以允许执行其他操作(如reverse示例中所示)。

您讨论的示例方法:

public<T>  void run (T obj )

...都不做,所以type参数毫无意义。该方法可能也已经声明为public void run(Object obj)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章