【问题标题】: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<T> task),它返回一个T类型的Future对象,但是Future<T>前面还有一个<T>,它代表什么?
【问题讨论】:
标签:
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】:
领先的<T> 将T 定义为类型参数(又名泛型),简单来说,该函数使用称为T 的泛型类型参数,其中T 是类型(在撰写本文时(Java 1.8),仅支持引用类型)
<T> void fn(T t); // T is a type parameter
例如,整数可以是具体类型
<Integer>fn(1);
编译器通常可以如下推断类型
fn(1)
在您的示例中,提交 Callable<Integer> 会返回 Future<Integer>
Future<Integer> future = executor.submit(callableInteger);
Integer futureResult = future.get(); //type-saftey powered by generics
您可以查看this 了解详细说明。
【解决方案4】:
代表模板。无需单独为整数列表、浮点列表等编码,只需为泛型类型 T 编码一次,然后根据需要分配给不同的类型。
【解决方案5】:
它声明了一个仅适用于submit() 方法的类型变量。
Executor 不是泛型的,但它的一些方法使用泛型类型,在方法修饰符和返回类型之间声明。