Java 泛型方法与通配符-编译错误
我有一个问题(要简化):Java 泛型方法与通配符-编译错误,java,generics,Java,Generics,我有一个问题(要简化): 公共无效方法(列表>列表){…} 现在,我的问题是,为什么下面的工作呢 public <T> void method(List<List<T>> list){...} 公共无效方法(列表){…} 我想我在“案例研究3”中找到了答案: 如果方法签名使用多级通配符类型,则泛型方法签名和通配符版本之间始终存在差异。这里有一个例子。假设有一个泛型类型框,我们需要声明一个接受框列表的方法 (具有类型参数的方法的)示例: publicstat
公共无效方法(列表>列表){…}
现在,我的问题是,为什么下面的工作呢
public <T> void method(List<List<T>> list){...}
公共无效方法(列表){…}
我想我在“案例研究3”中找到了答案:
如果方法签名使用多级通配符类型,则泛型方法签名和通配符版本之间始终存在差异。这里有一个例子。假设有一个泛型类型框,我们需要声明一个接受框列表的方法
(具有类型参数的方法的)示例:
publicstaticvoidprint1(列表){
对于(框:列表){
系统输出打印项次(框);
}
}
示例(带通配符的方法):
publicstaticvoidprint2(列表框:List){
系统输出打印项次(框);
}
}
这两种方法都是性能良好的方法,但它们并不等价。通用版本需要相同类型的框的同质列表。通配符版本接受不同类型的框的异构列表。当调用这两个print方法时,这将变得可见
我想我在“案例研究3”中找到了答案: 如果方法签名使用多级通配符类型,则泛型方法签名和通配符版本之间始终存在差异。这里有一个例子。假设有一个泛型类型框,我们需要声明一个接受框列表的方法 (具有类型参数的方法的)示例:
publicstaticvoidprint1(列表){
对于(框:列表){
系统输出打印项次(框);
}
}
示例(带通配符的方法):
publicstaticvoidprint2(列表框:List){
系统输出打印项次(框);
}
}
这两种方法都是性能良好的方法,但它们并不等价。通用版本需要相同类型的框的同质列表。通配符版本接受不同类型的框的异构列表。当调用这两个print方法时,这将变得可见
在处理多级通配符语法时,确实会出现混淆。让我们了解一下这些类型的确切含义:
表示所有列表
实例化的一系列,您不能将列表
传递给数组列表
是一个通配符参数化类型。它表示一系列不同类型的列表
。基本上,它可能是一个列表
列表
表示所有列表
实例化的一系列,您不能将列表
传递给数组列表
是一个通配符参数化类型。它表示一系列不同类型的列表
。基本上,它可能是一个列表
列表
列表>
可以包含列表
和列表
泛型类型必须完全匹配,否则您可能会得到错误的赋值。基本原因是
列表>
可能包含列表和列表
泛型类型必须完全匹配,否则您可能会得到错误的赋值。可能重复的@Nambari不是真正的重复。@RohitJain:如果需要,我会删除它,但接受的答案涵盖了所有与泛型相关的内容(AFAIK)。OP发布的下面的答案来自其中一个参考资料。@Nambari是的,接受的答案确实提供了所有优秀教程和泛型参考资料的链接,但它没有特别提到多级通配符,这就是OP的案例。相关:可能是@Nambari的副本,但实际上不是副本。@RohitJain:如果需要,我会删除它,但公认的答案涵盖了所有与泛型相关的内容(AFAIK)。OP发布的下面的答案来自其中一个参考资料。@Nambari是的,接受的答案确实提供了所有关于泛型的好教程和参考资料的链接,但它并没有专门讨论多级通配符,这正是OP的案例。相关:@PaulBellora你是对的。我对答案做了一些修改。现在没事了。谢谢你指出这一点。:)哎呀,我错了。“对不起,”保罗贝拉说。我正在删除我先前的评论。@PaulBellora你说得对。我对答案做了一些修改。现在没事了。谢谢你指出这一点。:)哎呀,我错了。“对不起,”保罗贝拉说。我删除了我先前的评论。
method(new ArrayList<List<String>>()); // This line gives the error
public void method(List<? extends List<?>> list){...}
public <T> void method(List<List<T>> list){...}
public static <T> void print1( List <Box<T>> list) {
for (Box<T> box : list) {
System.out.println(box);
}
}
public static void print2( List <Box<?>> list) {
for (Box<?> box : list) {
System.out.println(box);
}
}