泛型方法

类型参数要放在修饰符之后,返回类型之前

public static <T> void swap(T[] array,int i,int j)

调用时:

String[] friends = ...;
Arrays.swap(friends,0,1)

编译器可以推断T应是String类型

类型限定

public static <T extends AutoCloseable> void closeAll(ArrayList<T> elems) throws Exception{for(T elem:elems) elem.close();
}

类型变异和通配符

  • 协变性
    可以将 Manager[] 数组传递给参数为 Employee[] 的方法
    因Manager[]是 Employee[] 的子类型

但是,ArrayList<Manager>不是ArrayList<Employee>的子类型
这时不允许转换

  • 子类型通配符
    public static void printNames(ArrayList<? extends Employee> staff)

"?"表示一个未知的Employee子类型

可以给这个方法传递一个Employee类型或者它的子类组成的数组列表

这种方法只能读不能写,因为可以将未知的传入类型转换成Employee类型,但不能将任何对象转换为一个未知的<?extends Employee>

  • 父类型通配符
    ? super Employee代表任意一个Employee的父类类型(包括Object)
    这种通配符经常用作函数式参数
    Predicate<T>接口有一个方法,用于测试T类型的对象是否有特定的属性
public interface Predicate<T>{boolean test(T arg);...
}
public static void printAll(Employee[] staff,Predicate<? super Employee> filter){for(Employee e:staff)if(filter.test(e))System.out.println(e.getName());
}
  • 带类型变量的通配符

3个例子:

  1. public static <T> void printAll(T[] elements,Predicate<? super T> filter)
  2. public void addAll(Collection<? extends E> c)
  3. public static <T extends Comparable<? super T>> void sort(List<T> list)
  • 无限定通配符和通配符捕获
import java.util.ArrayList;public class 枚举类型 {public static void swap(ArrayList<?> elements,int i,int j){swapHelper(elements,i,j);}private static <T> void swapHelper(ArrayList<T> elements,int i,int j){T temp=elements.get(i);elements.set(i,elements.get(j));elements.set(j,temp);}public static void main(String[] args) {ArrayList<String> ele=new ArrayList<>();ele.add("dasd");ele.add("daaaa");swap(ele,0,1);System.out.println(ele);}
}

输出结果:[daaaa,dasd]

《core JAVA for the impatient》阅读笔记(5) 泛型编程相关推荐

  1. core JAVA for the impatient 阅读笔记(3) 继承

    继承一个类 实例变量和动态变量称为域,类中的域,方法和嵌套类/接口统称为类成员 反射机制:一种在程序运行期间查找类及其成员的能力 return **super.**getSalary()+bonus; ...

  2. Core Java For The Impatient-阅读笔记1.基本的编程结构

    Core Java For The Impatient 1.基本的编程结构 1.Key Points 在Java,所有的方法必须在类声明.非静态方法只能在所属类的对象上调用. 静态方法不是通过对象调用 ...

  3. [Core Java® for the Impatient]重载Java2

    2019独角兽企业重金招聘Python工程师标准>>> Chapter 2. Object-Oriented Programming Set(Mutator Methods)方法改变 ...

  4. Java并发编程艺术阅读笔记(一)

    Java并发编程艺术阅读笔记(一) 1.什么是上下文切换 CPU通过时间片分配算法循环执行任务,执行完一个任务的时间片后就会切换到下一个任务.但是在切换任务之前会保存上一个任务的状态,在切换回该任务, ...

  5. java怎么重载两次_[Core Java® for the Impatient]重载Java2

    Chapter 2. Object-Oriented Programming Set(Mutator Methods)方法改变对象的状态,Get(accessor methods)方法则不: Java ...

  6. 《core JAVA for the impatient》阅读笔记(2) lambda表达式

    lambda表达式 只有一个抽象方法的接口对象,就可以提供一个lambda表达式(函数式接口) 将lambda表达式放入类型为函数式接口的变量中,这样它就被转换为该接口的实例 list.removeI ...

  7. 《core Java for the impatient》阅读笔记(1) 基本编程结构

    第一章 基本的编程结构 System类中声明了一个常量 public static final PrintStream out 可以在任何地方使用System.out 这是少有的几个常量没有大写的情况 ...

  8. 《Java开发手册》阅读笔记(三)

    一.集合处理 1.只要覆写 equals,就必须覆写 hashCode:Set集合存储对象必须重写hashCode和equals:自定义对象作为map的key必须重写- image.png 2.Arr ...

  9. 《Java深入解析》阅读笔记二(运算符与表达式)

    ---恢复内容开始--- i+++j如何计算 +++的运算 i+++j的结合运算是:(i++)+j. 贪心规则 因为编译器极度的"贪心",所以他会尽可能多的结合有效的符号,而不管结 ...

最新文章

  1. (转)用ASP.NET向Javascript传递变量 方法1:
  2. 常用JQuery插件整理
  3. 揭开netty神秘面纱_Netty 源码(ChannelHandler 死磕)
  4. grep, sed 和 awk 学习总结
  5. ExtJS 3.2 学习笔记(1)
  6. Python 运算符day04
  7. 高通QCC3020应用开发的软件平台的搭建
  8. 百度_360_谷歌等各大搜索引擎网站收录提交入口
  9. android竖屏固定,安卓教程:设置竖屏固定壁纸
  10. 武汉大学计算机电气,武汉大学电气与自动化学院
  11. 互联网应用:不以抄袭为耻,但以抄袭为常
  12. 现代电子计算机音乐制作,现代电子音乐制作利器——Alesis VI61 MIDI键盘
  13. 纯前端实现登记照压缩宽高体积大小和换装功能
  14. CSP认证:棋局评估
  15. 计算机对逻辑算符的运算次序,逻辑运算符的优先顺序
  16. 艾永亮:如何“睡”出一只11亿美元的独角兽?
  17. Scylladb 高可用测试结果
  18. 超级详细!!!SpringBoot2核心技术与响应式编程尚硅谷完整知识点笔记 下篇 自动配置、容器、Web、数据响应、拦截器、SQL、NOSQL、原理、Junit5、Actuator、外部化配置等
  19. 2018东华计算机复试,18东华双控初试复试经验
  20. 【正点原子MP157连载】第四十一章 RGB转HDMI实验-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7

热门文章

  1. mysql中进行数据分析_SQL数据分析(一)
  2. 轻音乐 钢琴曲 搜集
  3. Java分布式二手房项目尚好房第四课 二手房和房源管理
  4. 目前最先进的神经网络算法,神经网络算法发展
  5. 肿瘤标志物检测一般有哪些项目
  6. 如何使用python语言而辩论
  7. python3.4.4下载安装教程_python 环境搭建 及python-3.4.4的下载和安装过程
  8. js中的回调函数的理解和使用方法
  9. BlackBerry 9900通过 中国银行卡检测中心SWP-NFC通讯认证
  10. 【电力电子技术】有源逆变与无源逆变