为什么此通用方法中有一个额外的<E>?

2022-09-03 17:52:36

我前段时间学习了java泛型,但现在我正在学习集合,并发现了一些我不理解的代码。代码如下:

static <E> List<E> nCopies(int n, E value)

它来自类 。java.util.Collections

我的问题是为什么有:

<E> List<E>

而且不仅如此

List<E>

显然我错过了一些东西,有人可以为我澄清一下吗?


答案 1

您可以使用 来规范您正在定义的方法。<E>

泛型最常见的例子是有一个这样的类型化类:

public class SomeClass<E> {
    ...
}

然后,当您创建该类的新对象时,您可以直接定义类型,如下所示:

new SomeClass<String>();

这样,对于该实例,该类中引用 的任何方法都将被视为字符串。<E><E>

现在考虑一个静态方法(它不绑定到类的任何特定实例),为了对该方法进行类型化,您使用了另一种适用于方法的类型化,如下所示:

static <E> List<E> nCopies(int n, E value)

您可以使用前面的返回类型来表示“此特定方法在执行时将考虑一些 E”。调用该方法时将决定将决定什么:<E><E>

nCopies(3, "a");

在此示例中,将是一个 String,因此返回类型将是 .<E>List<String>

最后,您甚至可以将它们混合在一起:

public class SomeClass<E> {
    public <F> void doSomething(E e, F f) {
        ...
    }
}

在这种情况下,如果您有 SomeClass 的实例,则 doSomething 方法中的 E 将始终为 String(对于该实例),但 F 可以是您想要的任何内容。


答案 2

在 中,第一个表示它是一个类型参数。如果您没有指定它,那么Java会认为in引用了一个名为的实际类,并要求您导入它。请参见泛型方法<E> List<E><E>EEE valueE