On Java generics lower bound usage: ? super T
我试图在一定程度上理解下限通配符的用法。我正在尝试编写一个通用方法
1 | <T> void copy(List<T> dest, List<? extends T> src) |
我认为这个签名是全面的,可以解决所有的情况。但是,我发现在Java集合类中,方法签名是这样的:
1 | <T> void copy(List<? super T> dest, List<? extends T> src) |
我不明白他们为什么用
如果没有明确的类型见证,就没有实际的区别。
如果不象ERAN那样指定类型见证,两种方法之间的灵活性就没有区别。
从本质上讲,使用
- 明确的意图:
? super T 更明确地显示了dest 应该采用什么类型。 - 模块化:您根本不需要查看
src 上的类型约束就可以知道dest 可以采用什么类型。 - producer extends,consumer super(pecs):producer参数(以下简称"in")应使用
extends ,consumer参数(以下简称"out")应使用super 关键字。
使用EDCOX1,2,也被Java教程推荐(他们甚至使用EDCOX1 11函数):
For purposes of this discussion, it is helpful to think of variables as providing one of two functions:
An"In" Variable
An"in" variable serves up data to the code. Imagine acopy method with two arguments:copy(src, dest) . Thesrc argument provides the data to be copied, so it is the"in" parameter.An"Out" Variable
An"out" variable holds data for use elsewhere. In thecopy example,copy(src, dest) , thedest argument accepts data, so it is the"out" parameter.You can use the"in" and"out" principle when deciding whether to use a wildcard and what type of wildcard is appropriate. The following list provides the guidelines to follow:
Wildcard Guidelines:
- An"in" variable is defined with an upper bounded wildcard, using the
extends keyword.- An"out" variable is defined with a lower bounded
wildcard, using thesuper keyword.
下面是一个例子:
以下代码段通过签名为
1 2 3 4 |