《core JAVA for the impatient》阅读笔记(5) 泛型编程
泛型方法
类型参数要放在修饰符之后,返回类型之前
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个例子:
public static <T> void printAll(T[] elements,Predicate<? super T> filter)
public void addAll(Collection<? extends E> c)
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) 泛型编程相关推荐
- core JAVA for the impatient 阅读笔记(3) 继承
继承一个类 实例变量和动态变量称为域,类中的域,方法和嵌套类/接口统称为类成员 反射机制:一种在程序运行期间查找类及其成员的能力 return **super.**getSalary()+bonus; ...
- Core Java For The Impatient-阅读笔记1.基本的编程结构
Core Java For The Impatient 1.基本的编程结构 1.Key Points 在Java,所有的方法必须在类声明.非静态方法只能在所属类的对象上调用. 静态方法不是通过对象调用 ...
- [Core Java® for the Impatient]重载Java2
2019独角兽企业重金招聘Python工程师标准>>> Chapter 2. Object-Oriented Programming Set(Mutator Methods)方法改变 ...
- Java并发编程艺术阅读笔记(一)
Java并发编程艺术阅读笔记(一) 1.什么是上下文切换 CPU通过时间片分配算法循环执行任务,执行完一个任务的时间片后就会切换到下一个任务.但是在切换任务之前会保存上一个任务的状态,在切换回该任务, ...
- java怎么重载两次_[Core Java® for the Impatient]重载Java2
Chapter 2. Object-Oriented Programming Set(Mutator Methods)方法改变对象的状态,Get(accessor methods)方法则不: Java ...
- 《core JAVA for the impatient》阅读笔记(2) lambda表达式
lambda表达式 只有一个抽象方法的接口对象,就可以提供一个lambda表达式(函数式接口) 将lambda表达式放入类型为函数式接口的变量中,这样它就被转换为该接口的实例 list.removeI ...
- 《core Java for the impatient》阅读笔记(1) 基本编程结构
第一章 基本的编程结构 System类中声明了一个常量 public static final PrintStream out 可以在任何地方使用System.out 这是少有的几个常量没有大写的情况 ...
- 《Java开发手册》阅读笔记(三)
一.集合处理 1.只要覆写 equals,就必须覆写 hashCode:Set集合存储对象必须重写hashCode和equals:自定义对象作为map的key必须重写- image.png 2.Arr ...
- 《Java深入解析》阅读笔记二(运算符与表达式)
---恢复内容开始--- i+++j如何计算 +++的运算 i+++j的结合运算是:(i++)+j. 贪心规则 因为编译器极度的"贪心",所以他会尽可能多的结合有效的符号,而不管结 ...
最新文章
- (转)用ASP.NET向Javascript传递变量 方法1:
- 常用JQuery插件整理
- 揭开netty神秘面纱_Netty 源码(ChannelHandler 死磕)
- grep, sed 和 awk 学习总结
- ExtJS 3.2 学习笔记(1)
- Python 运算符day04
- 高通QCC3020应用开发的软件平台的搭建
- 百度_360_谷歌等各大搜索引擎网站收录提交入口
- android竖屏固定,安卓教程:设置竖屏固定壁纸
- 武汉大学计算机电气,武汉大学电气与自动化学院
- 互联网应用:不以抄袭为耻,但以抄袭为常
- 现代电子计算机音乐制作,现代电子音乐制作利器——Alesis VI61 MIDI键盘
- 纯前端实现登记照压缩宽高体积大小和换装功能
- CSP认证:棋局评估
- 计算机对逻辑算符的运算次序,逻辑运算符的优先顺序
- 艾永亮:如何“睡”出一只11亿美元的独角兽?
- Scylladb 高可用测试结果
- 超级详细!!!SpringBoot2核心技术与响应式编程尚硅谷完整知识点笔记 下篇 自动配置、容器、Web、数据响应、拦截器、SQL、NOSQL、原理、Junit5、Actuator、外部化配置等
- 2018东华计算机复试,18东华双控初试复试经验
- 【正点原子MP157连载】第四十一章 RGB转HDMI实验-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7