首页 > 其他分享 >在泛型中extends和super是两个关键字区别

在泛型中extends和super是两个关键字区别

时间:2023-11-02 20:11:57浏览次数:27  
标签:类型 extends Integer 泛型 MyClass super

在泛型中,extends和super是两个关键字,用于限制泛型类型参数的上界和下界。它们在泛型中的使用有以下区别:

  1. extends:用于限制泛型类型参数的上界,表示类型参数必须是指定类型或其子类型。在使用extends时,我们可以从泛型对象中获取数据,但不能添加任何元素。

示例代码:

public class MyClass<T extends Number> {
    private T value;

    public MyClass(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }
}

MyClass<Integer> myInt = new MyClass<>(10);
MyClass<Double> myDouble = new MyClass<>(3.14);

Integer intValue = myInt.getValue(); // 可以获取Integer类型的值
Double doubleValue = myDouble.getValue(); // 可以获取Double类型的值

myInt.setValue(20); // 错误!无法添加元素
myDouble.setValue(4.5); // 错误!无法添加元素

在上面的例子中,通过使用extends关键字,我们限制了泛型类型参数T必须是Number类或其子类。这样,我们可以在MyClass中安全地使用Number类中的方法和属性。

  1. super:用于限制泛型类型参数的下界,表示类型参数必须是指定类型或其父类型。在使用super时,我们可以向泛型对象中添加数据,但无法从中获取数据。

示例代码:

public void addToList(List<? super Integer> list) {
    list.add(10);
    list.add(20);
}

List<Number> numberList = new ArrayList<>();
List<Object> objectList = new ArrayList<>();

addToList(numberList); // 可以添加Integer类型的元素到Number类型的List中
addToList(objectList); // 可以添加Integer类型的元素到Object类型的List中

Integer number = numberList.get(0); // 错误!无法获取Integer类型的值
Integer object = objectList.get(0); // 错误!无法获取Integer类型的值

在上面的例子中,通过使用super关键字,我们限制了List的类型参数必须是Integer的父类型。这样,我们可以将Integer类型的元素添加到List中,因为Integer是Number和Object的子类。

总结:extends和super在泛型中的区别在于extends用于限制上界,可以获取数据但不能添加元素;super用于限制下界,可以添加元素但不能获取数据。这两个关键字提供了在泛型中更精确的类型约束和灵活的类型使用。

标签:类型,extends,Integer,泛型,MyClass,super
From: https://www.cnblogs.com/longan-wang/p/17806183.html

相关文章

  • Matplotlib Superscript format in matplotlib plot legend 上标下标
    在绘图的标题、坐标轴的文字中用上标或下标$正常文字^上标$ importmatplotlib.pyplotaspltfig,ax=plt.subplots()ax.set(title=r'Thisisanexpression$e^{\sin(\omega\phi)}$',xlabel='meters$10^1$',ylabel=r'Hertz$(\frac{1}{s})$')plt.sho......
  • TypeScript入门到精通——泛型
    泛型 泛型程序设计是一种编程风格或编程范式,它允许在程序中定义形式类型参数,然后在泛型实例化时使用实际类型参数来替换形式类型参数。通过泛型,我们能够定义通用的数据结构或类型,这些数据结构或类型仅在它们操作的实际类型上有差别。泛型程序设计是实现可重用组件的一种手段。......
  • super的查找顺序严格按照mro列表找
    调用父类方法的第一种方式:指名道姓的方式,跟继承关无关#object写与不写,在py3中没有区别.#有的人在py3中这么写,是为了向下兼容,使复制到py2中也能使用classPerson(object):def__init__(self,name,age):self.name=nameself.age=agedefi......
  • 配置Supervisor开机启动
    配置Supervisor开机启动:新建一个“supervisord.service”文件#dserviceforsystemd(CentOS7.0+)#byET-CS(https://github.com/ET-CS)[Unit]Description=Supervisordaemon[Service]Type=forkingExecStart=/usr/bin/supervisord-c/etc/supervisor/supervisord.co......
  • 记一次BeanCopy泛型擦除问题
    publicclassA{List<User1>users;}publicclassB{List<User2>users;}Bb=Bean.copy(A,B.class);使用beancopy某类如果包含List或map范型时,会被泛型替换。最后b里面的users内部元素时User1类型若B是rpc接口的入参,此时通过rpc传递到下游接口,下游接口没有Use......
  • Django+celery使用supervisor进行进程守护
    1.库版本supervisor4.2.5django-celery-beat2.5.0django-celery-results2.5.1Django4.2.6环境:Linux项目路径:/opt/new/new_project2.制作软连接已知,Python的安装目录是/usr/local/python3,其下有bin/include/lib和share四个目录,其中bin里面就是我们安装pip库后的可......
  • 无涯教程-Clojure - superset?函数
    判断set1是否是set2的超集。superset?-语法以下是语法。(superset?set1set2)参数   - "set1"是第一组元素,"set2"是第二组元素。返回值 - 如果set1是set2的超集,则为true,否则为false。superset?-示例(nsclojure.examples.example(:require[cloju......
  • CF592D Super M
    妈的还在做水题这题乍一看感觉要建虚树,但后面一想建个屁又没有多次询问直接DFS一遍把子树里没有关键点的点全删了就完事了然后第一直觉是来个树上DP啥的,设两个状态表示子树内走了回来/不回来的最小代价但后面冷静了一下仔细一想其实每条边都是要走两次的,除了起点到终点这条路径......
  • Java拾贝第九天——泛型
    Java拾贝不建议作为0基础学习,都是本人想到什么写什么如果一个类中,不想限定具体类型的属性,或某个方法的返回值和传参。可以在类声明时通过一个标识来表示。这样只需要在实例化类的时候声明具体的类型即可,这就是泛型泛型类泛型作用于类上就是泛型类。栗子:publicclassTest9......
  • 8.6 C++ 泛型化编程态
    C/C++语言是一种通用的编程语言,具有高效、灵活和可移植等特点。C语言主要用于系统编程,如操作系统、编译器、数据库等;C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统、图形用户界面、嵌入式系统等。C/C++语言具有很高的效率和控制能力,但也需要开发人员自行管理内存......