我遇到过这样的Java代码:

public interface Foo<E> {}

public interface Bar<T> {}

public interface Zar<?> {}

上述三种类型之间有什么区别?在Java中,他们将这种类型的类或接口声明称为什么?


当前回答

这比什么都要传统。

T代表一种类型 E是一个元素(List<E>:一个元素列表) K是Key(在Map<K,V>中) V是Value(作为返回值或映射值)

它们是完全可互换的(尽管在同一声明中存在冲突)。

其他回答

好吧,前两者之间没有区别——它们只是为类型参数使用了不同的名称(E或T)。

第三个不是有效的声明- ?用作通配符,在提供类型参数时使用,例如List<?> foo =…意思是foo指向某个类型的列表,但我们不知道是什么类型。

所有这些都是泛型,这是一个相当大的主题。你可能希望通过以下资源了解它,当然还有更多可用的资源:

Java泛型教程 泛型语言指南 Java编程语言中的泛型 Angelika Langer的Java泛型常见问题解答(大量而全面;更多参考资料)

编译器将捕获每个通配符(例如,List中的问号),当它构成如下函数时:

foo(List<?> list) {
    list.put(list.get()) // ERROR: capture and Object are not identical type.
}

然而,像V这样的泛型类型就可以了,并将其作为泛型方法:

<V>void foo(List<V> list) {
    list.put(list.get())
}

这比什么都要传统。

T代表一种类型 E是一个元素(List<E>:一个元素列表) K是Key(在Map<K,V>中) V是Value(作为返回值或映射值)

它们是完全可互换的(尽管在同一声明中存在冲突)。

类型变量<T>可以是您指定的任何非基元类型:任何类类型、任何接口类型、任何数组类型,甚至是另一个类型变量。

最常用的类型参数名是:

E - Element(被Java集合框架广泛使用) K -键 N -数字 T型 V -值

在Java 7中,允许像这样实例化:

Foo<String, Integer> foo = new Foo<>(); // Java 7
Foo<String, Integer> foo = new Foo<String, Integer>(); // Java 6

最常用的类型参数名是:

E - Element (used extensively by the Java Collections Framework)
K - Key
N - Number
R - Result
T - Type
V - Value
S,U,V etc. - 2nd, 3rd, 4th types

您将在整个Java SE API中看到这些名称