主要的<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
它声明了一个类型变量,该变量的作用范围仅限于submit()
方法。
Executor
不是泛型的,但它的一些方法使用泛型类型,在方法修饰符和返回类型之间声明。
基本上,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 );
“p”代表模板。不必为整数列表、浮点数列表等分别编写代码,只需为通用类型T编写一次代码,然后根据需要分配到不同的类型。
这是一个泛型方法的示例。泛型方法允许使用“类型参数”(在本例中)来表示一个或多个参数的类型和/或其返回类型之间的“依赖关系”。
在这种情况下,Future submit(Callable task) 中的 Future 表示 Future 和 Callable 指定的类型之间的依赖关系。
在另一种情况下,void copy(List dest, List src) 表示 T 和 S 之间存在一个依赖关系,即 S extends T。
如果没有这样的依赖关系,则不应使用泛型方法。 例如:void fn(T t) - 因为只有一个参数且没有返回类型,所以不需要指定前导符号来表示泛型方法。
更多细节请参见此处。