据我所知,它<? super T>代表任何超级类T(T任何级别的父类).但我真的很难想象这个通用绑定通配符的任何现实生活示例.
我明白了什么<? super T>意思,我看过这个方法:
public class Collections {
public static <T> void copy(List<? super T> dest, List<? extends T> src) {
for (int i = 0; i < src.size(); i++)
dest.set(i, src.get(i));
}
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个真实生活用例的例子,可以使用这种结构,而不是解释它是什么.
我注意到在执行中有些奇怪HashMap.clear().这就是它在OpenJDK 7u40中的表现:
public void clear() {
modCount++;
Arrays.fill(table, null);
size = 0;
}
Run Code Online (Sandbox Code Playgroud)
这就是OpenJDK 8u40的外观:
public void clear() {
Node<K,V>[] tab;
modCount++;
if ((tab = table) != null && size > 0) {
size = 0;
for (int i = 0; i < tab.length; ++i)
tab[i] = null;
}
}
Run Code Online (Sandbox Code Playgroud)
我知道现在table为空地图可以为null,因此需要在局部变量中进行额外的检查和缓存.但为什么被Arrays.fill()for-loop取代?
似乎在此提交中引入了更改.不幸的是,我没有找到解释为什么普通for循环可能比更好Arrays.fill().它更快吗?还是更安全?
java.util.Collections.max的签名如下所示:
public static <T extends Object&Comparable <?super T >> T max(Collection collection);
根据我的理解,它基本上意味着T必须是 java.lang.Object和java.lang.Comparable <?超级T >>,
但是,由于每个java.lang.Comparable也是一个java.lang.Object,上面的签名和下面的签名有什么区别?:
public static <T extends Comparable <?super T >> T max(Collection collection);
这是签名解释的Collections.max()后续问题,其中接受的答案并未涉及此通配符的实际原因.
该max方法需要一个Collection<? extends T>,我无法想到这个通配符有用的实际案例.
通常,如果您的API只使用类型参数T作为参数,则其使用应该利用较低的有界通配符(?super T).相反,如果API仅返回T,您将通过使用上限有通配符(?extends T)为您的客户提供更大的灵活性.
但我仍然没有得到它.甚至Java Generics and Collections一书也没有说明这个通配符背后的原因.
这有实际用途吗?一个真实世界的用例会很棒.
当Comparable界面变得通用时,声明就变成了
interface Comparable<T>
Run Code Online (Sandbox Code Playgroud)
真的应该是这样的
interface Comparable<T extends Comparable<T>>
Run Code Online (Sandbox Code Playgroud)
T没有延伸是没有意义的,Comparable因为实现者必须确保这一点
a.compareTo(b)
Run Code Online (Sandbox Code Playgroud)
和
b.compareTo(a)
Run Code Online (Sandbox Code Playgroud)
总是有相反的迹象.
我一直认为获得声明"错误"的原因与生成现有界面的问题有关,但我无法解释它.
有没有人有任何见解?
在阅读了Sun关于泛型的文档之后,我转到了http://docs.oracle.com/javase/tutorial/java/generics/QandE/generics-questions.html上的Q和E部分.
对于Q8 -
编写一个通用方法来查找列表[begin,end]范围内的最大元素.
我写的代码是:
private static <T extends Comparable<T>> T max(List<T> l, int i, int j) {
List<T> sublist = l.subList(i, j);
System.out.println("Sublist "+sublist);
int c = 0;T max = null;
for(T elem: sublist) {
if(c == 0 || max.compareTo(elem) < 0) {
max = elem;
} ++c;
}
return max;
}
Run Code Online (Sandbox Code Playgroud)
而Sun的回答是:
public static <T extends Object & Comparable<? super T>>
T max(List<? extends T> list, int begin, int end) {
T maxElem = list.get(begin);
for …Run Code Online (Sandbox Code Playgroud)