List<? super T>和之间有什么区别List<? extends T>?
我曾经使用List<? extends T>,但它不允许我添加元素list.add(e),而List<? super T>它.
我在阅读泛型时遇到了PECS(制片extends人和消费者的super简称).
能否给我一个人解释如何使用佩奇之间解决困惑extends和super?
我在Oracle的网站上读到了Java的类型擦除.
什么时候发生类型擦除?在编译时还是运行时?当班级加载?当类被实例化时?
很多站点(包括上面提到的官方教程)都说在编译时会发生类型擦除.如果在编译时完全删除了类型信息,那么当调用使用泛型的方法而没有类型信息或错误的类型信息时,JDK如何检查类型兼容性?
考虑以下示例:Say class A有一个方法,empty(Box<? extends Number> b).我们编译A.java并获取类文件A.class.
public class A {
public static void empty(Box<? extends Number> b) {}
}
Run Code Online (Sandbox Code Playgroud)
public class Box<T> {}
Run Code Online (Sandbox Code Playgroud)
现在我们创建另一个类B,该类empty使用非参数化参数(原始类型)调用该方法:empty(new Box()).如果我们编译B.java与A.class在类路径中,javac的是足够聪明,引发警告.所以A.class 有一些类型信息存储在其中.
public class B {
public static void invoke() {
// java: unchecked method invocation:
// method empty in class A is applied to given types
// required: Box<? extends java.lang.Number>
// found: …Run Code Online (Sandbox Code Playgroud) 我不明白未绑定的通配符泛型的用途是什么.带有上边界的绑定通配符泛型<? extends Animal>非常有意义,因为使用多态性我可以使用该类型或集合.但是具有任何类型的泛型有什么意义呢?它不会破坏仿制药的目的吗?编译器没有发现任何冲突,在类型擦除之后,就像没有使用泛型一样.
为什么List[scala.Int]类型擦除,以List[Object]同时Integer在List[java.lang.Integer]似乎会保留吗?例如,javap对于
object Foo {
def fooInt: List[scala.Int] = ???
def fooInteger: List[java.lang.Integer] = ???
}
Run Code Online (Sandbox Code Playgroud)
输出
public scala.collection.immutable.List<java.lang.Object> fooInt();
public scala.collection.immutable.List<java.lang.Integer> fooInteger();
Run Code Online (Sandbox Code Playgroud)
我们看到的Integer是第二种情况。文档状态
Object如果泛型类型中的所有类型参数都带有边界,或者类型参数不受限制,则将其替换。
这可能是由于“ bounds”子句引起的吗?如果是这样,此界限在哪里指定?
java ×7
generics ×6
type-erasure ×2
collections ×1
pecs ×1
raw-types ×1
scala ×1
super ×1
wildcard ×1