Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.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(1.6)泛型通配符_Java_Generics - Fatal编程技术网

Java(1.6)泛型通配符

Java(1.6)泛型通配符,java,generics,Java,Generics,考虑流动情况: class A { } class B extends A { } List <? extends A> x = new ArrayList<A>(); List <? extends A> xx = new ArrayList<B>(); A类{ } B类扩展了A类{ } 列出你写它的方式,没有区别 在编译时,两者具有相同的类型;即,扩展a 这就是为什么您不能向任一列表添

考虑流动情况:

    class A {

    }

    class B extends A {

    }


    List <? extends A> x = new ArrayList<A>();
    List <? extends A> xx = new ArrayList<B>();
A类{
}
B类扩展了A类{
}

列出你写它的方式,没有区别

在编译时,两者具有相同的类型;即,扩展
a

这就是为什么您不能向任一列表添加任何内容–您不知道它实际上是
列表
还是
列表
或其他类型

在运行时,它们也具有相同的类型;即,
列表
。由于类型擦除,类型参数在运行时不存在

因为您不再保存对它的任何强类型引用,所以没有人知道其中一个列表实际上是一个
列表

这些通配符的要点是用于函数。

您可以创建一个函数,该函数采用的
列表没有区别。这一切归结为两个对象列表。你只是想哄骗编译器帮你一把,因为它非常聪明,可以帮助你抓住不好的用法。你告诉它,只要列表中的类型是-a,一切都很好。编译器可以帮助突出显示任何问题。

我知道在运行时没有类型参数,但您的回答假设在版本6中,Java工程师毫无理由地保留了冗余的参数化类型。我不想认为他们只是没有注意到这点。)@whiteErru:我不知道你的意思。类型参数存在,编译器必须跟踪它们。实际的类型参数(
List
)在任何地方都不可见,因此编译器不需要跟踪它们。在运行时(JVM)
List,因为表达式的使用并不总是知道类型。例如,
newarraylist().someMethod()
,或
Collections.sort(newarraylist())