本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动链接
问题;Java泛型里面'E','T',和'?'的区别是什么?
我碰到这样一个Java代码
public interface Foo<E> {}
public interface Bar<T> {}
public interface Zar<?> {}
What is the difference among all three of the above and what do they call this type of class or interface declarations in Java?
上诉的三者有什么区别。Java里面应该怎么样调用这种声明类型的类或者接口呢?
回答一
前两者之间没有区别-它们只是对类型参数使用了不同的名称(E或T)。
第三个不是一个有效的声明-?用作通配符,是在提供类型参数时使用,
例如 List<?> foo = ...意思是foo指向某个类型的列表,但我们不知道这个类型是什么。
所有这些都是泛型,这是一个相当大的类别。你如果你想深入学习了解它的话,可以通过以下资源,当然还有更多可用的资源:
- Java Tutorial on Generics
- Language guide to generics
- Generics in the Java programming language
- Angelika Langer's Java Generics FAQ (massive and comprehensive; more for reference though)
回答二
它比其他任何东西都更遵照惯例。
-
T指的是类型
-
E是一个元素(
List<E>: 一个元素列表) -
K是Key (在一个Map里面)
-
V是Value(作为返回值或映射的值)
它们是完全可互换的(虽然在同一声明语句中会存在冲突)
回答三
compiler will make a capture for each wildcard (e.g., question mark in List) when it makes up a function like: 编译器将捕获每个通配符(例如List中的问号),当通配符构成了如下函数时:
foo(List<?> list) {
list.put(list.get())
}
然而,像V这样的泛型类型是可以的,并可以组成一个泛型方法:
<V>void foo(List<V> list) {
list.put(list.get())
}
文章翻译自Stack Overflow:stackoverflow.com/questions/5…