Java Genericity
四、 Java Genericity
1. Genericity 泛型
泛型 <T> 1. 泛型就是参数化类型 2. 作用:安全,方便 3. 适用于对多种数据类型执行相同功能的代码,主要适用于集合 4. 泛型中的类型在使用时指定,不能是基本数据类型5. 不能在静态方法和静态属性中使用所在类的泛型 6. 通常用单个大写字母表示,尽可能见名知意(T Type, K Key, V Value, E Element ...)7. 泛型嵌套:由外向内拆分 public class Genericity { public static void main(String[] args) { List<String> list = new ArrayList<String>(); // 安全 list.add("So easy");// 编译时会进行类型检测 // 方便 String str = list.get(0);// 不需要强制转型 // JDK 1.4 之前 List list2 = new ArrayList(); list2.add(1); list2.add("So"); // 取出数据,麻烦,不安全 Integer num = (Integer)list2.get(0); if(list2.get(1) instanceof String){ String str2 = (String)list2.get(1); } } } // 泛型接口 public interface IGenericity<T> { public static final int MAX_VALUE = 1024; public abstract void method(T t) {}; public abstract T method02(T t) {}; } // 泛型类 public class Genericity<T> { public T age; public static T name;// 报错,不能在静态属性中使用所在类的泛型 public void method(T t) {} public static void method02(T t) {}// 报错,不能在静态方法中使用所在类的泛型} // 泛型方法,在返回类型、void 前使用 <字母> public <T> void method() {}
2. 继承、实现泛型类
继承、实现泛型类 1. 父类为泛型类 | 泛型接口,子类继承 | 实现时: * a.父类存在泛型,子类必须 >= * b.父类擦除(即使用时 | 实现时 | 继承时没有指定类型)或指定类型,子类按需编写 * c.属性类型和方法根据所在位置而定:在父类中的,随父类而定;在子类中的,随子类而定 public abstract class Father<T1, T2> { T1 age; public abstract void test(T2 name); } // 父类存在泛型,子类必须 >= // 1.擦除,没有指定具体类型。类似于 Object,但不等同于 Object,因为没有指定具体类型,在编译时不会进行类型检测;但如果指定为 Object,则在编译时会进行类型检测 public class Son extends Father/*<Object,Object>*/{ @Override public void test(Object name) {} } // 2.全部保留 public class Son01<T1, T2> extends Father<T1, T2>{ @Override public void test(T2 name) {} } // 3.部分保留 public class Son02<T2, A, B> extends Father<Integer, T2>{ @Override public void test(T2 name) {} } // 4.不保留 public class Son03 extends Father<Integer, String>{ @Override public void test(String name) {} }
3. ? 通配符
? 通配符 * 1.类型不确定 * 2.只用于声明变量 | 形参 * 3.不能用在创建对象、泛型类、泛型方法、泛型接口上 public class Wildcards { // 声明变量 List<?> list = new ArrayList<>(); list = new ArrayList<String>(); list = new ArrayList<Integer>(); // 声明形参 public static void test(List<?> list){ } // 编译错误,不能用在创建对象 list = new ArrayList<?>(); // 编译错误,不能用在创建泛型方法 public static <?> void test(){} // 编译错误,不能用在创建泛型类 class Test<?>{} }
4. extends 泛型上限 & super 泛型下限
extends 泛型的上限 <= * 1.一般用于限制操作 * 2.不能使用在添加数据上,一般是读取操作 super 泛型的下限 >= * 1.一般用于限制操作 * 2.能够添加数据,不能添加父类对象 public class Father {} public class Son extends Father{} public class Grandson extends Son{} public class Extends { public static void main(String[] args) { // 规则 List<? extends Father> list = new ArrayList<Father>(); test(list); List<Father> list2 = new ArrayList<Father>(); test(list2); List<? extends Father> list3 = new ArrayList<Son>(); test(list3); List<? extends Son> list4 = new ArrayList<GrandSon>(); test(list4); List<?> list5 = new ArrayList<Son>(); test(list5);// 编译错误,因为 <?> 等同于 <? extends Object> } // ? extends Father public static void test(List<? extends Father> list){ /* 不能用于添加数据!!! list.add(new Object()); list.add(new Father()); list.add(new Son()); list.add(new Grandson()); */ list.add(null); System.out.println(list.get(0)); } } public class Super { public static void main(String[] args) { //规则 List<Son> list = new ArrayList<Son>(); test(list); List<Father> list2 = new ArrayList<Father>(); test(list2); List<Object> list3 = new ArrayList<Object>(); test(list3); List<? super Son> list4 = new ArrayList<Son>(); test(list4); List<? super Father> list5 = new ArrayList<Father>(); test(list5); List<? super Grandson> list6 = new ArrayList<Son>(); test(list6);// 编译错误,因为 <? super Grandson> 中存在不满足 <? super Son> 的情况 List<?> list7 = new ArrayList<Object>(); test(list7);// 编译错误,<?> 等同于 <? extends Object> 存在不满足 <? super Son> 的情况 } // ? super Son public static void test(List<? super Son> list){ // 不能添加父类对象 list.add(new Father()); list.add(new Object()); list.add(new Son()); list.add(new Grandson()); } }
Java Genericity的更多相关文章
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- Java Class.cast方法
1.Java api public T cast(Object obj); Casts an object to the class or interface represented 解释的比较笼统, ...
- Thinking in Java——笔记(15)
Generics The term "generic" means "pertaining or appropriate to large groups of class ...
- Java Programming Language Enhancements
引用:Java Programming Language Enhancements Java Programming Language Enhancements Enhancements in Jav ...
- Java基础常见英语词汇
Java基础常见英语词汇(共70个) ['ɔbdʒekt] ['ɔ:rientid]导向的 ['prəʊɡræmɪŋ]编程 OO: object ...
- java泛型编程
一般的类和方法都是针对特定数据类型的,当写一个对多种数据类型都适用的类和方法时就需要使用泛型编程,java的泛型编程类似于C++中的模板,即一种参数化类型的编程方法,具体地说就是将和数据类型相关的信息 ...
- Java面试题之基础篇概览
Java面试题之基础篇概览 1.一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个public的类,且public的类名必须与文件名相一致. 2.Ja ...
- 专业英语词汇(Java)
abstract (关键字) 抽象 ['.bstr.kt] access vt.访问,存取 ['.kses]‘(n.入口, ...
- Java基础学习-泛型概述和测试
1.举例 首先先用集合来写个自定义对象存储并且去遍历. package genericity; import java.util.ArrayList; import java.util.Collect ...
随机推荐
- uva 1364
刘书上例题 #include <cstdio> #include <cstdlib> #include <cmath> #include <set> # ...
- java数据结构和算法09(哈希表)
树的结构说得差不多了,现在我们来说说一种数据结构叫做哈希表(hash table),哈希表有是干什么用的呢?我们知道树的操作的时间复杂度通常为O(logN),那有没有更快的数据结构?当然有,那就是哈希 ...
- Ubuntu 16.04安装Fiddler抓包工具(基于Mono,且会有BUG)
说明:Fiddler官方提供了Mono版本的,但是只有2014版本的,不是最新的,并且运行期间会有BUG,比如界面错乱卡死等等,但是勉强能代理,抓SSL的包,如果使用了要做好心理准备.将就一下还是可以 ...
- ln 软连接 & 硬连接
创建软连接的方式 #ln -s soure /file object 创建软连接是连接文件本身,可以跨分区建立软连接,不会应为不同分区而出现不能使用的问题. 在创建软连接的文件中,修改一处文件另一处同 ...
- hdu 3255 Farming(扫描线)
题目链接:hdu 3255 Farming 题目大意:给定N个矩形,M个植物,然后给定每一个植物的权值pi,pi表示种植物i的土地,单位面积能够收获pi,每一个矩形给定左下角和右上角点的坐标,以及s, ...
- HDU 1017 A Mathematical Curiosity【看懂题意+穷举法】
//2014.10.17 01:19 //题意: //先输入一个数N,然后分块输入,每块输入每次2个数,n,m,直到n,m同一时候为零时 //结束,当a和b满足题目要求时那么这对a和b就是一组 ...
- OpenvSwitch代码分析之bridge和port
ovs-vsctl add-br br0 会在数据库里面加入新bridge的信息ovs-vsctl add-port br0 eth0 会在数据库里面加入新的port信息 void bridge_ru ...
- Android-shareSDK
1.当数据: 地址:http://sharesdk.mob.com/Download 2.集成数据: DOS命令: java -jar QuickIntegrater.jar (输入自己的项目名 ...
- 【CTF】后续深入学习内容
1.i春秋 https://www.ichunqiu.com/course/451 搜索black hat,可以看到黑帽大会的内容.免费. 2.wireshark 基础篇 1)由于Wireshark是 ...
- jQuery 1.x and 2.x , which is better?
1. jQuery 1.x和2.x的区别 或者可以说是jQuery 2.x有什么新特征? jQuery官方发布2.x原话 不再支持IE6/7/8,如果在IE9/10里只用“兼容性视图”模式也将会受到影 ...