我看到一个看起来像这样的java函数-
public static<T> foo() {...}
我知道泛型是什么,但有人可以在这种情况下解释吗?谁决定 T 等于多少?这里发生了什么?
编辑:有人可以给我看一个这样的函数的例子。
我看到一个看起来像这样的java函数-
public static<T> foo() {...}
我知道泛型是什么,但有人可以在这种情况下解释吗?谁决定 T 等于多少?这里发生了什么?
编辑:有人可以给我看一个这样的函数的例子。
您错过了返回类型,但除此之外它是一个通用方法。与泛型类型一样,T
代表任何引用类型(如果给定,则在范围内)。
对于方法,泛型参数通常由编译器推断。在某些情况下,您可能希望自己指定通用参数,使用稍微特殊的语法:
List<String> strings = Collections.<String>emptyList();
在这种情况下,编译器可以推断出类型,但编译器是否可以推断并不总是很明显。注意,<>
是在点之后。出于语法原因,必须始终指定类型名称或目标对象。
有可能有泛型构造函数,但我从来没有在野外见过这样的构造函数,而且语法变得更糟。
我相信 C++ 和 C# 语法将泛型类型放在方法/函数名称之后。
上下文是一个通用方法,而不是一个类。该变量<T>
仅适用于方法的调用。 Collections 类有许多这些;类本身不是通用的,但许多方法是通用的。
编译器决定 T 等于什么——它等于使类型工作的任何东西。有时这比其他人更容易。
例如static <T> Set<T> Collections.singleton(T o)
在参数中定义类型的方法:
Collections.singleton(String T)
将返回一个Set<String>
.
有时类型很难定义。例如,有时输入的信息不够容易Collection.emptyList()
。在这种情况下,您可以直接指定类型:Collection.<String>emptyList()
.
T 它是形式类型参数,它将被对象实例化时使用的实际类型参数替换。
例如,这里是 java.util 包中的 List 和 Iterator 定义:
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 代表一个 List 版本,其中 E 已被 String 统一替换:
public interface StringList{
void add(String x)
Iterator<String> iterator();
}