在看java容器类的时候经常可以看到<T extends Comparable<? super T>>,感觉十分不解?

我们觉得<T extends Comparable<T>>我们是知道的,T是实现了Comparable接口的类型,因此他们之间可以进行比较,

<? super T>表名类型参数需要是T或T的父类,那么<T extends Comparable<? super T>>到底是什么意思呢?

对T的约束是Comparable的子类,对Comparable中泛型的约束是,?至少是T的父类,那么就意味着T是?的子类。

一言以蔽之:元素必须是实现了Comparable接口的类或者其子类,可以使用父类方法比较子类型

/**
* Created by wangbin10 on 2018/9/18.
* mySort2() list中的元素必须是实现了Comparable接口的类或者其子类
* Java采取的是类型擦除的方法来实现泛型,并通过extends和super关键字来约束泛型的上界和下界。
* extends关键字用于确定泛型的上界。<A extends B>表示类B或者其子类。
* super关键字用于确定泛型的下界,<A super B>表示类B或者其父类,一直到Object。?则是一个通配符。
* 因此,<T extends Comparable<? super T>>表示了上界为实现了Comparable接口的类,<? super T>则表示实现Comparable接口的类的子类也可以,从而确定下界
*/
public class Test {
public static void main(String[] args) {
List<Animal> animals = new ArrayList<>();
animals.add(new Animal(25));
animals.add(new Dog(34));
mySort1(animals);//ok List<Dog> dogs = new ArrayList<>();
dogs.add(new Dog(18));
dogs.add(new Dog(19));
/**
* 这个编译不能通过,因为T推断是Animal,得到的是Dog,Dog没有实现Comparable,所以不行
* mySort1(dogs);
* */ mySort2(animals);//ok
mySort2(dogs);//ok
} /**
* mySort1的类型参数是T extends Comparable<T>,他要求T必须实现Comparable
* @param list
* @param <T>
*/
public static <T extends Comparable<T>> void mySort1(List<T> list) {
Collections.sort(list);
System.out.println("mySort1 Success!");
} /**
* list中的元素必须是实现了Comparable接口的类或者其子类
* @param list
* @param <T>
*/
public static <T extends Comparable<? super T>> void mySort2(List<T> list) {
Collections.sort(list);
System.out.println("mySort2 Success!"); }
} class Animal implements Comparable<Animal> {
int age; public Animal(int age) {
this.age = age;
} @Override
public int compareTo(Animal o) {
return Integer.compare(this.age, o.age);
}
} /**
* Dog根本不能implements Comparable<Dog>,因为这样就会实现两个相同的接口
*/
class Dog extends Animal {
public Dog(int age) {
super(age);
}
}

如何理解<T extends Comparable<? super T>>的更多相关文章

  1. 如何理解<base href="<%=basePath%>" ---转载

    原文链接http://316325524.blog.163.com/blog/static/6652052320111118111620897/ "base href " 今天在写 ...

  2. 如何理解<base href="<%=basePath%>"

    原文链接http://316325524.blog.163.com/blog/static/6652052320111118111620897/ "base href " 今天在写 ...

  3. <base href="<%=basePath%>

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  4. JSP中<base href="<%=basePath%>">作用

    通常在JSP页面开通有如下代码: <% String path = request.getContextPath(); String basePath = request.getScheme() ...

  5. JSP页面中 <base href="<%=basePath%>">

    base标记是一个基链接标记,是一个单标记.用以改变文件中所有连结标记的参数内定值.它只能应用于标记<head>与</head>之间.你网页上的所有相对路径在链接时都将在前面加 ...

  6. 当使用了相对路径 <base href="<%= basePath %>" /> 后,全局都只能使用相对路径

    <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" ...

  7. JSP中<base href="<%=basePath%>">的作用

    来源于:http://fanshuyao.iteye.com/blog/2097229 首先了解是什么是<base href=""> <base href=&qu ...

  8. [Angular2 Router] Understand the Angular 2 Base href Requirement

    The <base href=”/”/> you define will determine how all other assets you plan on loading treat ...

  9. window.location.href = basePath + "paper/deleteExpertComment.action?expertId="+$(this).prev().val();

    window.location.href = basePath + "paper/deleteExpertComment.action?expertId="+$(this).pre ...

  10. 深入理解Oracle的并行操作-转载

    转载:http://czmmiao.iteye.com/blog/1487568 并行(Parallel)和OLAP系统 并行的实现机制是:首先,Oracle会创建一个进程用于协调并行服务进程之间的信 ...

随机推荐

  1. 利用jQuery传送json格式的字符串,后端用ashx文件来接收

    在Default.aspx里面,我们会透过javascript建立两个物件,分别有Name和Age的属性,再透过Array的方式,将这两个物件塞到Array里面去.使用Ajax内建的$.ajax AP ...

  2. 编程算法 - 二叉搜索树(binary search tree) 代码(C)

    二叉搜索树(binary search tree) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 二叉搜索树(binary search tree)能 ...

  3. 面试问题:Vista与XP的Session 0与Session X的区别

    面试问题:Vista与XP的Session 0与Session X的区别 在XXXXX的一次面试中,笔试问题的题目曾提到Session 0.Session 1在Vista和Xp中的区别?现在把答案发上 ...

  4. 让ProgressDialog在setCancelable(false)时按返回键可dismiss

    最近发现Android4.0系统中ProgressDialog设置为setCancelable(true)时,点击ProgressDialog以外的区域也可以让ProgressDialog dismi ...

  5. Massive Collection Of Design Patterns, Frameworks, Components, And Language Features For Delphi

    Developer beNative over on GitHub has a project called Concepts which is a massive collection of Del ...

  6. 从FrameworkElement对象创建Cursor对象

    原文:从FrameworkElement对象创建Cursor对象 Normal 0 false false false EN-US ZH-CN X-NONE MicrosoftInternetExpl ...

  7. vector删,erase和remove难怪--【STL】

    供vector使用容器.通常只是一个简单的遍历查找,其他操作已执行,这不是,今天,稍有不慎. erase方法的操作是将此时的节点删除,然后指向被删除节点的下一个: 如对数据1 6 6 4 7; #in ...

  8. Linux性能测试 top衍生命令 atop/htop/slaptop

    1. Atop Atop 是一个类似 top 的工具,但比 top 更有料.通过 Atop,你能够监视 Linux 系统的性能状况,包括进程活动.CPU.内存.硬盘.网络等方面的使用情况等. 2. h ...

  9. BSD介绍

    BSD许可证模板  * Copyright (c) 1998, Regents of the University of California  * All rights reserved.    * ...

  10. C# WinForm 文件上传下载

    /// <summary> /// WebClient上传文件至服务器 /// </summary> /// <param name="fileNamePath ...