我看到了一个看起来像这样的java函数 -
public static<T> foo() {...}
我知道什么是泛型,但有人可以解释这个背景吗?谁决定T等于什么?怎么回事?
编辑:有人可以给我看一个像这样的函数的例子。答案 0 :(得分:11)
你错过了返回类型,但除此之外它是一种通用方法。与泛型类型一样,T
代表任何引用类型(如果给定,则在边界内)。
对于方法,通用参数通常由编译器推断。在某些情况下,您可能希望自己使用一种稍微特殊的语法来指定泛型参数:
List<String> strings = Collections.<String>emptyList();
在这种情况下,编译器可以推断出类型,但编译器是否可以并不总是很明显。注意,<>
位于点之后。出于语法原因,必须始终指定类型名称或目标对象。
可能有通用构造函数,但我从未见过一个通用的构造函数,语法变得更糟。
我相信C ++和C#语法将泛型类型放在方法/函数名之后。
答案 1 :(得分:2)
上下文是一个泛型方法而不是类。变量<T>
仅适用于方法的调用.Collections类有许多这些;类本身不是通用的,但许多方法都是。
编译器决定T等于什么 - 它等于获得类型的工作。有时这比其他人容易。
例如,方法static <T> Set<T> Collections.singleton(T o)
类型在参数中定义:
Collections.singleton(String T)
将返回Set<String>
。
有时类型很难定义。例如,有时候输入Collection.emptyList()
的信息不够容易。在这种情况下,您可以直接指定类型:Collection.<String>emptyList()
。
答案 2 :(得分:0)
这是正式的类型参数,它将被实际类型取代 在对象实例化时使用的参数。
例如,这是包java.util中的List和Iterator definitios:
public interface List<E>{
void add(E x);
Iterator<E> iterator();
}
public interface Iterator<E>{
E next();
boolean hasNext();
}
然后你可以用这种方式实例化一个List:
List<String> ls = new ArrayList<String>()
您可能会想到List代表E所具有的List版本 被String统一替换:
public interface StringList{
void add(String x)
Iterator<String> iterator();
}