Mee*_*ary 5 java generics collections wildcard
我已经声明了一个方法,其参数是Number下面给出的子类型:
public static void organizeData(java.util.List<? extends Number> c) {
//operation on the list
}
Run Code Online (Sandbox Code Playgroud)
我可以将任何非参数化列表作为参数传递.那么使用通配符有<? extends Number>什么意义呢?
List newList = new LinkedList<>();
ClassName.organizeData(newList);
Run Code Online (Sandbox Code Playgroud)
为什么我Object要从中获取类型元素c?而不是类型Number?有没有办法只允许一种类型的子类型作为参数传递,而不允许非参数化的参数呢?
你在这里问三个问题,我将分别回答.顺便说一下,你会发现阅读Java Generics FAQ很有价值- 被许多人认为是关于这个主题的规范参考:
<? extends Number>什么意义呢?Number例如,当参数化参数是子类时,您需要使用通配符Integer.例如:
import java.util.LinkedList;
import java.util.List;
public class NumberTest {
public static void main(String... args) {
List<Integer> newList = new LinkedList<Integer>();
organizeData(newList); // This works!
anotherMethod(newList); // Doesn't compile
}
private static void organizeData(List<? extends Number> list) {
}
private static void anotherMethod(List<Number> list) {
}
}
Run Code Online (Sandbox Code Playgroud)
第二个方法调用因编译错误而失败:
NumberTest.java:9: error: method anotherMethod in class NumberTest cannot be applied to given types;
anotherMethod(newList); // Doesn't compile
^
required: List<Number>
found: List<Integer>
reason: actual argument List<Integer> cannot be converted to List<Number> by method invocation conversion
1 error
Run Code Online (Sandbox Code Playgroud)
Object要从中获取类型元素c?而不是类型Number?您Object在第二种情况下获得某种类型的原因是因为您使用的是原始类型.如果由于这个原因可以避免使用原始类型,则永远不应该使用原始类型 - 您将失去编译器类型检查的所有优点.
您不能以您描述的方式阻止堆污染,因为有人总是可以转换为Raw类型,然后转换为所需的任何内容.泛型是仅编译时构造,并且在编译后最终被擦除.这就是为什么只能通过注释来抑制未选中类型转换警告的原因.
| 归档时间: |
|
| 查看次数: |
1134 次 |
| 最近记录: |