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 ...
随机推荐
- MongoDB学习day07--mongoose入门,数据库增删改查,默认参数,模块化
一.mongoose介绍 Mongoose 是在 node.js 异步环境下对 mongodb 进行便捷操作的对象模型工具. Mongoose 是 NodeJS 的驱动, 不能作为其他语言的驱动. M ...
- linux命名详解及其软件安装实例
始于cd,ls命令 好啦,步入正题,我使用的linux连接工具为xshell,mRemoteNG,对两款工具不做介绍啦,你可以百度一下,实在不会入左上方群. 进入之后,便是上面的界面黑乎乎一片,对于初 ...
- C++ Virtual 关键字
虚函数是C++中用于多态的机制.核心理念就是通过基类访问派生类定义的函数. 基类的析构含糊都必须是virtual的 虚函数只能借助于指针或者引用来达到多态的效果. 前提B类继承与A类 且foo()为虚 ...
- JavaScript高级程序设计重点(一)
1.一个完整的 JavaScript 实现应该由下列三 个不同的部分组成 核心(ECMAScript) 文档对象模型(DOM) 浏览器对象模型(BOM) 2.Undefined 类型只有一 ...
- 百度统计的JS脚本原理解析
一句话:在你的网站上加载百度统计的脚本,这个脚本会收集你的本地信息,然后发送给百度统计网站 https://blog.csdn.net/iqzq123/article/details/8877645 ...
- java quartz的使用,做时间轮询调用 CronTrigger
import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionExceptio ...
- [转] Scalers:刻意练习的本质就是持续行动+刻意学习
原文: http://www.scalerstalk.com/1264-peak-conscious ------------------------------------------------- ...
- 分享:APK高级保护方法解析(三)
刷朋友圈.玩游戏.看新闻,智能手机正在以我们无法想象的速度飞快发展,可是随之而来的安全问题也越来越引人关注,APP二次打包.反编译.盗版的现象屡见不鲜.因此须要对APK进行加固保护. 眼下市面上常见的 ...
- C#软件开发实例.私人订制自己的屏幕截图工具(十)在截图中包括鼠标指针形状
本实例所有文章文件夹 (一)功能概览 (二)创建项目.注冊热键.显示截图主窗体 (三)托盘图标及菜单的实现 (四)基本截图功能实现 (五)针对拖拽时闪烁卡顿现象的优化 (六)加入配置管理功能 (七)加 ...
- web 开发之js---ajax 中的两种提交方式ajax post 和 ajax get 实例
()post http://04101334.iteye.com/blog/637695/ ()get function serializeElement(element) { var method ...