我是Java的新手,正在尝试学习返回类型的概念。我正在阅读ExecutorService接口的Java API:
我知道submit(Callable<T> task)
,它会返回T类型的Future对象,但<T>
前面还有另一个Future<T>
,它代表什么?
答案 0 :(得分:4)
前导<T>
将T
定义为类型参数(也称为泛型),简单来说,该函数使用名为T的泛型类型参数,其中T为类型(在编写本文时(Java 1.8),仅支持引用类型)
<T> void fn(T t); // T is a type parameter
例如,Integer可以是具体类型
<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以获取详细说明。
答案 1 :(得分:3)
它声明了一个只有submit()
方法范围的类型变量。
Executor
不是通用的,但它的一些方法使用泛型类型,它们在方法修饰符和返回类型之间声明。
答案 2 :(得分: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 :(得分:1)
代表模板。而不是单独编写整数列表,浮点数列表等,只需为泛型类型T编码一次,然后根据需要分配给不同的类型。
答案 4 :(得分:0)
这是通用方法的示例。通用方法允许“类型参数”(在这种情况下)用于表示方法的一个或多个参数的类型和/或其返回类型中的“依赖项”。
在这种情况下,Future前面的Future提交(Callable任务)指示为Future和Callable指定的类型之间的依赖性。
在另一种情况下,void copy(List dest,List src)表示T和S具有S扩展T的依赖项。
如果没有这种依赖性,则不应使用通用方法。 例如:void fn(T t)-由于只有一个arg且没有返回类型,因此无需指定Lead来指示通用方法。
更多详细信息here。