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())