Java 源码中的 <? extends U>与 <? super L>是什么?

目录

?  extends  U

?  super  L

总结一下:


?  extends  U

其中extends意思为:扩大;扩展;延长,?我们可以把他看作一个通配符,匹配所有的接口,U就一个泛型占位符,所以连在一起可联想到,从U扩张到全部的意思,那实际的意思是什么那?

就是已U作为下限,扩展到所有实现了U接口的接口,类。

举例:

1 创建下面4个接口

package com.scm.myblog.utils.cs;

public interface A1 {
    String getName(String name);
}

------------------------
package com.scm.myblog.utils.cs;

public interface A2 {
    String getName2(String name2);
}
-------------------------
package com.scm.myblog.utils.cs;

public interface B1 extends A1,A2{
    String getNameB1(String nameB1);
}
-------------------------
package com.scm.myblog.utils.cs;

public interface C1 extends B1{
    String getNameC1(String nameC1);
}

2 创建一个测试类

package com.scm.myblog.utils.cs;

import java.util.ArrayList;
import java.util.List;

public class CS{
    public static void main(String[] args) {
        List testUpper;
        testUpper=new ArrayList();
        testUpper=new ArrayList();
        testUpper=new ArrayList();
        testUpper=new ArrayList();
    }
}

Java 源码中的 <? extends U>与 <? super L>是什么?_第1张图片

我们验证我们的解释,从B1开始,到所有实现,继承了它的接口,类都可以作为泛型参数传入。

?  super  L

其中super意思为:超级的顶级的,?我们可以把他看作一个通配符,匹配所有的接口,L就一个泛型占位符,所以连在一起可联想到,从L作为顶级,到L之下的所有意思,那实际的意思是什么那?

就是已L作为上现,扩展到L所实现,继承的所有的接口,类。

我们替换代码

package com.scm.myblog.utils.cs;

import java.util.ArrayList;
import java.util.List;

public class CS{
    public static void main(String[] args) {
        List testUpper;
        testUpper=new ArrayList();
        testUpper=new ArrayList();
        testUpper=new ArrayList();
        testUpper=new ArrayList();
    }
}

 Java 源码中的 <? extends U>与 <? super L>是什么?_第2张图片

结果如此,我们也得出结论,使用super,就是从B1开始,到B1所继承的,实现的所有的接口,类

总结一下:

 :表示从U开始到所有实现,继承了U的类,接口 

  :表示从L开始,到所有被L继承,实现的所有的类,接口

那么他们起到了什么作用?

1 规范泛型的界限,更加的安全

2 清晰的继承,实现关系,方便扩展

需要深入学习的看

(1条消息) Java泛型: 中的? 和 extends 的理解和使用实例_请叫我大师兄_的博客-CSDN博客

你可能感兴趣的:(java,servlet,java,jvm)