<T extends Comparable<T>>和<T extends Comparable<? super T>>含义

<T extends Comparable<T>>表明T实现了Comaprable<T>接口,此条件强制约束,泛型对象必须直接实现Comparable<T>(所谓直接就是指不能通过继承或其他方式)

<T extends Comparable<? super T>> 表明T的任意一个父类实现了Comparable<? super T>接口,其中? super T表示 ?泛型类型是T的父类(当然包含T),因此包含上面的限制条件,且此集合包含的范围更广

案例如下

   //    有限制的泛型  只允许实现Comparable接口的参数类型
//    从集合中找出最小值
    public static <T extends Comparable<T>> T min(List<T> list) {
        Iterator<T> iterator = list.iterator();
        T result = iterator.next();
        while (iterator.hasNext()) {
            T next = iterator.next();
            if (next.compareTo(result) < 0) {
                result = next;
            }
        }
        return result;
    }

    //    <T extends Comparable<? super T>> 限制
//    此方法 多一个 ? super T 约束 表明可以是T或者T的某个父类实现Comparable接口
    public static <T extends Comparable<? super T>> T min2(List<T> list) {
        Iterator<T> iterator = list.iterator();
        T result = iterator.next();
        while (iterator.hasNext()) {
            T next = iterator.next();
            if (next.compareTo(result) < 0) {
                result = next;
            }
        }
        return result;
    }

  Dog.java

package com.effectJava.Chapter2;
public class Dog extends Animal {
    private int age;
    private String name;
    private String hobby;

    public Dog(int id,int age, String name, String hobby) {
        super(id);
        this.age = age;
        this.name = name;
        this.hobby = hobby;
    }
    public void setName(String name) {
        this.name = name;
    }

    public void setHobby(String hobby) {
        this.hobby = hobby;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public String getHobby() {
        return hobby;
    }

    public int getAge() {
        return age;
    }
}

  Animal.java

package com.effectJava.Chapter2;

public class Animal implements Comparable<Animal> {

    //    唯一标识动物的id
    protected int id;

    public Animal(int id) {
        this.id = id;
    }

    public Animal() {

    }

    public void setId(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }

    @Override
    public int compareTo(Animal o) {
        return this.getId() - o.getId();
    }
}

  运行main函数

  List<Dog> dogs = new ArrayList<>();
        dogs.add(new Dog(1, 1, "1", "1"));
        dogs.add(new Dog(2, 2, "2", "2"));
        dogs.add(new Dog(3, 3, "3", "3"));
//        编译错误 由于Dog没有直接实现Comparable<Dog>接口
        min(dogs);
//        由于Dog父类Animal实现了Comparable<Dog>接口
        min2(dogs);

  

原文地址:https://www.cnblogs.com/09120912zhang/p/8319899.html

时间: 2024-10-13 16:39:56

<T extends Comparable<T>>和<T extends Comparable<? super T>>含义的相关文章

Standard C 之 math.h和float.h

对于C Standard Library 可以参考:http://www.acm.uiuc.edu/webmonkeys/book/c_guide/ 或者 http://www.cplusplus.com/reference/ (一) <math.h> 常用函数: 1. 三角函数 double sin(double);正弦 double cos(double);余弦 double tan(double);正切 2 .反三角函数 double asin (double); 结果介于[-PI/2,

&lt;limits.h&gt;和&lt;float.h&gt;

头文件<limits.h>中定义了用于表示整类型大小的常量.以下所列的值是可接受的最小值,实际系统中可能有更大的值. CHAR_BIT 8 char类型的位数 CHAR_MAX UCHAR_MAX或SCHAR_MAX char类型的最大值 CHAR_MIN 0或SCHAR_MIN char类型的最小值 INT_MAX 32767 int类型的最大值 INT_MIN -32767 int类型的最小值 LONG_MAX 2147483647 long的最大值 LONG_MIN -214748364

stdio.h和math.h文件内容

下面的头文件来自CodeBlocks 13.12配套的MINGW,主要是为了方便好奇的同学. 第一个文件是stdio.h. EOF在第47行 printf在第294行 FILE在第139行 stdin在第158行 1 /* 2 * stdio.h 3 * This file has no copyright assigned and is placed in the Public Domain. 4 * This file is a part of the mingw-runtime packa

df -h和du -h 占用空间为什么差这么多?

当磁盘大小超过标准时会有报警提示,这时如果掌握df和du命令是非常明智的选择. df可以查看一级文件夹大小.使用比例.档案系统及其挂入点,但对文件却无能为力.   du可以查看文件及文件夹的大小. 两者配合使用,非常有效.比如用df查看哪个一级目录过大,然后用df查看文件夹或文件的大小,如此便可迅速确定症结. 下面分别简要介绍 df命令可以显示目前所有文件系统的可用空间及使用情形,请看下列这个例子: 以下是代码片段: [[email protected] ~]$ df -hFilesystem 

VS2013使用winsock.h和winsock2.h发生冲突后的终极解决方法

问题:彻底无语了,不小心某个文件包含了windows.h头文件,而windows.h文件里面包含着winsock.h文件, 如果你下次使用winsock2.h文件时,位置不对,然后编译器会给你一大堆重定义错误问题. 初级解决办法: 把winsock2.h文件放在任何可能包含winsock.h文件(尤其是windows.h文件,它就包含了winsock.h文件)的前面,因为winsock2.h头文件有这样的宏定义: #ifndef _WINSOCK2API_#define _WINSOCK2API

最简单的基于librtmp的示例:发布H.264(H.264通过RTMP发布)

本文记录一个基于libRTMP的发布H.264码流的程序.该程序可以将H.264数据发布到RTMP流媒体服务器.目前这个例子还不是很稳定,下一步还有待修改. 本程序使用回调函数作为输入,通过自定义的回调函数,可以发送本地的文件或者内存中的数据. 函数调用结构图 本程序的函数调用结构图如下所示. 整个程序包含3个接口函数:RTMP264_Connect():建立RTMP连接.RTMP264_Send():发送数据.RTMP264_Close():关闭RTMP连接.按照顺序调用上述3个接口函数就可以

P?H?P?中?h?t?t?p?协?议?详?解

对PHP文件来说 Php可以有  html   css javascript php脚本 flash它的不同部分是在不同的地方执行的(服务器和客户端) http协议 1. http协议是建立在 tcp/ip协议基础上 2. 我们的web开发数据的传输都是依赖于http协议 3. http协议全称是超文本传输协议 http协议的  http请求 基本结构: 请求行 消息头 消息体(实体内容) Accept  text/html,application/xhtml+xml,application/x

24&gt;&gt;sys/types.h和fcntl.h有什么用

sys/types.h 是Unix/Linux系统的基本系统数据类型的头文件,含有size_t,time_t,pid_t等类型. 在应用程序源文件中包含 <sys/types.h> 以访问 _LP64 和 _ILP32 的定义.此头文件还包含适当时应使用的多个基本派生类型.尤其是以下类型更为重要: clock_t 表示系统时间(以时钟周期为单位). dev_t 用于设备号. off_t 用于文件大小和偏移量. ptrdiff_t 是一种带符号整型,用于对两个指针执行减法运算后所得的结果. si

已经包含了#include &lt;atlcom.h&gt; #include &lt;comutil.h&gt;还是报错

在WTL工程的.h中 #include <atlbase.h>#include <atlcom.h>#include <atlcomcli.h>#include <atlctl.h>#include <atlwin.h>#include <comutil.h> 结果还是下面一堆错,为什么呢,因为你没有使用这个using namespace ATL; 加上这个下面错全部消失. error C2061: syntax error : id

几大常用头文件stdio.h,stdio.h ,stdbool.h里的定义

C 标准库 - <stdio.h> 简介 stdio .h 头文件定义了三个变量类型.一些宏和各种函数来执行输入和输出. 库变量 下面是头文件 stdio.h 中定义的变量类型: 序号 变量 & 描述 1 size_t  这是无符号整数类型,它是 sizeof 关键字的结果. 2 FILE  这是一个适合存储文件流信息的对象类型. 3 fpos_t  这是一个适合存储文件中任何位置的对象类型. 库宏 下面是头文件 stdio.h 中定义的宏: 序号 宏 & 描述 1 NULL