Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 泛型方法与通配符-编译错误_Java_Generics - Fatal编程技术网

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); 
  } 
}