<T extends Number> void m1(List<T> list) {
list.add(list.get(0));
}
void m2(List<? extends Number> list) {
list.add(list.get(0));
}
方法add(capture#1-of?extends Number)
在类型列表
不适用于参数(捕获#2-of?extends Number)
因为你不能在有上限的类型列表上添加iten!您可以有一个列表或列表,其中一个不适合另一个修改操作!
List<? extends Number> list = new ArrayList<Integer>();
List<? extends Number> list = new ArrayList<Double>();
List<? extends Number> list = new ArrayList<Long>();
在这种情况下,变量列表可以具有扩展Number的实例中的任何类型。例如,您可以在方法中传递它。但在那里,你现在真的不是那种类型的人。您可以有一个ArrayList并对它说添加一个新的double。在编译时是有意义的,因为Double扩展了Number,但在运行时列表不能是这种类型并引发异常。
请记住,当您使用上限时,<?扩展t>
,不能修改列表,只读!有Oracle教程(请参见通配符章节内容-上界通配符、下界通配符等)
问题内容: 阅读Java在线教程,我对通配符捕获一无所知。例如: 为什么编译器无法保留分配的安全性?它知道,例如,通过执行带有整数列表的方法,它可以从i.get中获取一个整数值。因此,它尝试将索引0处的Integer值设置为相同的Integer列表(i)。那么,怎么了?为什么要编写通配符助手? 问题答案: 为什么编译器无法保留分配的安全性? 编译器不知道 任何 关于类型中的元素通过定义。通配符并
在阅读Java在线教程时,我对通配符捕获一无所知。例如:
下面的SCCE显示了实现接口标记的两个类(B和C)。对于实现Marker的每个类,都有一个实现泛型处理程序接口的对应类(B_处理程序、C_处理程序)。映射用于关联Pair的类类型。其次是它的关联处理程序。代码按预期执行;但是,我得到一个编译时警告: 警告:[未检查]未检查的强制转换处理程序h1=(处理程序)(dispatch.get(p1.second.get类()));需要:处理程序找到:处理程
我得到以下编译错误: 当我编译(在Eclipse Juno中使用JDK 1.7.0)以下代码时: null 这样我就可以测试我所有的排序实现并测试它们。我想将结果与Java的排序实现进行比较,所以我也在编写这个接口的实现,它在内部只调用Java的排序方法。这就是我面对问题的地方。
在这个问题中,我看到我可以使用帮助方法将通配符泛型“捕获”到类型T中以执行类型安全操作,如下所示: 但是当我尝试使用关键字执行此操作时,它不起作用: 我得到以下错误: 当使用扩展关键字时,有没有办法捕获通配符? 我的背景是,我有一个扩展给定类a的类列表,每个类都有一个不同的泛型参数T。对于每个类,我想获得对其T类的引用,我试图安全地进行类型转换。
问题内容: 在以下代码段中: 尽管类型似乎完全匹配,但分配是错误的。 我通过将Collection的类型指定为另一个通用参数,设计出了一种肮脏的解决方法,如下所示: 但是该参数实际上是“无关”类型,只会使API复杂化,在保持类型安全的同时,有没有什么方法可以摆脱它呢? 谢谢。 问题答案: 这样做就可以了: 您仍然可以像这样使用迭代器: 作为参考,请阅读get and put原理 (最初来自Java