【问题标题】:what does first <T> in "<T> Future<T> submit(Callable<T> task)" stands for?“<T> Future<T> submit(Callable<T> task)”中的第一个 <T> 代表什么?
【发布时间】:2016-06-10 08:07:45
【问题描述】:

我是 Java 新手,正在尝试学习返回类型的概念。我正在阅读 ExecutorService 接口的 Java API:

我知道submit(Callable&lt;T&gt; task),它返回一个T类型的Future对象,但是Future&lt;T&gt;前面还有一个&lt;T&gt;,它代表什么?

【问题讨论】:

  • 这是一个泛型方法声明,详见here

标签: java generics methods interface


【解决方案1】:

这是一个泛型方法的例子。泛型方法允许使用“类型参数”(在这种情况下)来表达方法和/或其返回类型的一个或多个参数的类型之间的“依赖关系”。

在这种情况下,Future submit(Callable task),在Future前面表示为Future和Callable指定的类型之间的依赖关系。

在另一种情况下,void copy(List dest, List src) 表示 T 和 S 有一个依赖关系,即 S extends T。

如果不存在这样的依赖关系,则不应使用泛型方法。 例如:void fn(T t) - 因为只有一个 arg 并且没有返回类型,所以不需要指定前导来指示泛型方法。

更多详情here.

【讨论】:

    【解决方案2】:

    基本上,T 是从Future 返回的值的类型(类)。

    因此,如果您使用Future 运行的任务返回String,那么T 就是String。同样,如果它返回一个整数,那么T 就是Integer

    例子:

    Future<String> future = executorService.submit( new Callable<String>(){
        public String call() throws Exception{
            return "the result";
        }
    });
    String result = future.get();
    assert "the result".equals( result );
    

    【讨论】:

      【解决方案3】:

      领先的&lt;T&gt;T 定义为类型参数(又名泛型),简单来说,该函数使用称为T 的泛型类型参数,其中T 是类型(在撰写本文时(Java 1.8),仅支持引用类型)

      <T> void fn(T t); // T is a type parameter
      

      例如,整数可以是具体类型

      <Integer>fn(1);
      

      编译器通常可以如下推断类型

      fn(1)
      

      在您的示例中,提交 Callable&lt;Integer&gt; 会返回 Future&lt;Integer&gt;

      Future<Integer> future = executor.submit(callableInteger);
      Integer futureResult = future.get(); //type-saftey powered by generics 
      

      您可以查看this 了解详细说明。

      【讨论】:

        【解决方案4】:

        代表模板。无需单独为整数列表、浮点列表等编码,只需为泛型类型 T 编码一次,然后根据需要分配给不同的类型。

        【讨论】:

          【解决方案5】:

          它声明了一个仅适用于submit() 方法的类型变量。

          Executor 不是泛型的,但它的一些方法使用泛型类型,在方法修饰符和返回类型之间声明。

          【讨论】:

            猜你喜欢
            • 2022-06-17
            • 2015-02-12
            • 2013-03-25
            • 1970-01-01
            • 2016-05-27
            • 2016-11-08
            • 2019-03-05
            • 1970-01-01
            相关资源
            最近更新 更多