我遇到过这样的Java代码:
public interface Foo<E> {}
public interface Bar<T> {}
public interface Zar<?> {}
上述三种类型之间有什么区别?在Java中,他们将这种类型的类或接口声明称为什么?
我遇到过这样的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中看到这些名称