java范型_Java知识点总结(Java泛型)
Java知识点总结(Java泛型)
@(Java知识点总结)[Java, Java泛型]
[toc]
泛型
泛型就是参数化类型
适用于多种数据类型执行相同的代码
泛型中的类型在使用时指定
泛型归根到底就是“模版”
优点:使用泛型时,在实际使用之前类型就已经确定了,不需要强制类型转换。
泛型主要使用在集合中
import java.util.ArrayList;
import java.util.List;
public class Demo01 {
// 不使用泛型,存取数据麻烦
public static void test1(){
List list = new ArrayList();
list.add(100);
list.add("zhang");
/*
* 从集合中获取的数据是Object类型,Object类型是所有类型的根类,但是在具体使用的时候需要
* 类型检查,类型转化,处理类型转化异常
* 使用麻烦
*/
Object o = list.get(1);
if (o instanceof String) {
String s = (String)o;
}
System.out.println(o);
}
// 使用泛型
public static void test2(){
List list = new ArrayList();
//list.add(100); 放数据时安全检查,100不是String类型,不能存放
list.add("存数据安全,取数据省心");
String s = list.get(0); //取出来的数据直接就是泛型规定的类型
System.out.println(s);
}
public static void main(String[] args) {
test1();
test2();
}
}
自定义泛型
泛型字母
形式类型参数(formal type parameters)即泛型字母
命名泛型字母可以随意指定,尽量使用单个的大写字母(有时候多个泛型类型时会加上数字,比如T1,T2)
常见字母(见名知意)
T Type
K V Key Value
E Element
当类被使用时,会使用具体的实际类型参数(actual type argument)代替
泛型类
只能用在成员变量上,只能使用引用类型
泛型接口
只能用在抽象方法上
泛型方法
返回值前面加上 <T>
/**
* 自定义泛型类
*
* 定义"模版"的时候,泛型用泛型字母:T 代替
* 在使用的时候指定实际类型
*
* @author Administrator
* @param
*/
public class Student {
private T javase;
//private static T javaee; // 泛型不能使用在静态属性上
public Student() {
}
public Student(T javase) {
this();
this.javase = javase;
}
public T getJavase() {
return javase;
}
public void setJavase(T javase) {
this.javase = javase;
}
}
/**
* 自定义泛型的使用
* 在声明时指定具体的类型
* 不能为基本类型
* @author Administrator
*
*/
class Demo02 {
public static void main(String[] args) {
//Student Student = new Student(); //不能为基本类型,编译时异常
Student student = new Student();
student.setJavase(85);
System.out.println(student.getJavase());
}
}
/**
* 自定义泛型接口
*
* 接口中泛型字母只能使用在方法中,不能使用在全局常量中
*
* @author Administrator
* @param
*/
public interface Comparator {
//public static final T1 MAX_VALUE = 100; //接口中泛型字母不能使用在全局常量中
//T1 MAX_VALUE;
public static final int MAX_VALUE = 100;
void compare(T2 t);
T2 compare();
public abstract T1 compare2(T2 t);
}
import java.io.Closeable;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.List;
/**
* 非泛型类中定义泛型方法
* @author Administrator
*
*/
public class Method {
// 泛型方法,在返回类型前面使用泛型字母
public static void test1(T t){
System.out.println(t);
}
// T 只能是list 或者list 的子类
public static void test2(T t){
t.add("aa");
}
// T... 可变参数 ---> T[]
public static void test3(T...a) {
for (T temp : a) {
try {
if (null != temp) {
temp.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws FileNotFoundException {
test1("java 是门好语言");
test3(new FileInputStream("a.txt"));
}
}
泛型的继承
/**
* 泛型继承
*
* 保留父类泛型 ----》泛型子类
* 不保留父类泛型 -----》子类按需实现
*
* 子类重写父类的方法,泛型类型随父类而定 子类使用父类的属性,该属性类型随父类定义的泛型
*
* @author Administrator
*
* @param
* @param
*/
public abstract class Father {
T1 age;
public abstract void test(T2 name);
}
// 保留父类泛型 ----》泛型子类
// 1)全部保留
class C1 extends Father {
@Override
public void test(T2 name) {
}
}
// 2) 部分保留
class C2 extends Father {
@Override
public void test(Integer name) {
}
}
// 不保留父类泛型 -----》子类按需实现
// 1)具体类型
class C3 extends Father {
@Override
public void test(Integer name) {
}
}
// 2)没有具体类型
// 泛型擦除:实现或继承父类的子类,没有指定类型,类似于Object
class C4 extends Father {
@Override
public void test(Object name) {
}
}
/**
* 泛型擦除
* 类似于Object,不等于Object
* @author Administrator
*
*/
public class Demo03 {
public static void test(Student student){
student.setJavase(100);
}
public static void main(String[] args) {
// 泛型擦除
Student student = new Student();
test(student);
Student student2 = new Student();
//test(student2); //编译异常
}
}
通配符
通配符(Wildcards)
T、K、V、E 等泛型字母为有类型,类型参数赋予具体的值
?未知类型 类型参数赋予不确定值,任意类型
只能用在声明类型、方法参数上,不能用在定义泛型类上
/**
* 泛型的通配符 类型不确定,用于声明变量或者形参上面
*
* 不能使用在类上 或者 new 创建对象上
* @author Administrator
*
*/
public class Demo04 {
// 用在形参上
public static void test(List> list) {
List> list2; // 用在声明变量上
list2 = new ArrayList();
list2 = new ArrayList();
list2 = new ArrayList();
}
public static void main(String[] args) {
test(new ArrayList());
test(new ArrayList());
}
}
extends/super
上限(extends)
指定的类必须是继承某个类,或者实现了某个接口(不是implements),即<=
? extends List
下限(super)
即父类或本身
? super List
import java.util.ArrayList;
import java.util.List;
/**
* extends:泛型的上限 <= 一般用于限制操作 不能使用在添加数据上,一般都是用于数据的读取
*
* supper:泛型的上限 >= 即父类或自身。一般用于下限操作
*
* @author Administrator
* @param
*/
public class Test {
private static void test01() {
Test t1 = new Test();
Test t2 = new Test();
Test t3 = new Test();
}
private static void test02(List extends Fruit> list) {
}
private static void test03(List super Apple> list) {
}
public static void main(String[] args) {
// 调用test02(),测试 extends <=
test02(new ArrayList());
test02(new ArrayList());
test02(new ArrayList());
// test02(new ArrayList()); Object 不是 Fruit 的子类 ,编译不通过
// 调用test03() ,测试super >=
test03(new ArrayList());
test03(new ArrayList());
//test03(new ArrayList()); ReadApple < apple,所以不能放入
}
}
class Fruit {
}
class Apple extends Fruit {
}
class Pear extends Fruit {
}
class ReadApple extends Apple {
}
泛型嵌套
从外向里取
import java.util.Map.Entry;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* 泛型嵌套
* @author Administrator
*
*/
public class Demo05 {
public static void main(String[] args) {
Student2 student = new Student2();
student.setScore("优秀");
System.out.println(student.getScore());
//泛型嵌套
School> school = new School>();
school.setStu(student);
String s = school.getStu().getScore(); //从外向里取
System.out.println(s);
// hashmap 使用了泛型的嵌套
Map map = new HashMap();
map.put("a", "张三");
map.put("b", "李四");
Set> set = map.entrySet();
for (Entry entry : set) {
System.out.println(entry.getKey()+":"+entry.getValue());
}
}
}
public class School {
private T stu;
public T getStu() {
return stu;
}
public void setStu(T stu) {
this.stu = stu;
}
}
public class Student2 {
T score;
public T getScore() {
return score;
}
public void setScore(T score) {
this.score = score;
}
}
其他
import java.util.ArrayList;
import java.util.List;
/**
* 泛型没有多态
* 泛型没有数组
* JDK1.7对泛型的简化
* @author Administrator
*
*/
public class Demo06 {
public static void main(String[] args) {
Fruit fruit = new Apple(); // 多态,父类的引用指向子类的对象
//List list = new ArrayList(); //泛型没有多态
List extends Fruit> list = new ArrayList();
//泛型没有数组
//Fruit[] fruits = new Fruit[10];
//ArrayList底层是一个Object[],它放数据的时候直接放,取数据的时候强制类型转化为泛型类型
/*public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}*/
/*E elementData(int index) {
return (E) elementData[index];
}*/
//JDK1.7泛型的简化,1.6编译通不过
List list2 = new ArrayList<>();
}
}
java范型_Java知识点总结(Java泛型)相关推荐
- java范形_java范型简介
java范型简介 一.简单认识java范型 经常听人说"范型",我一直不是太明白什么叫"范型",今天就查阅了一些文章,给我的第一感觉就是之所以在java中用范型 ...
- Java范值_Java范型
定义类的时候,不为类的属性或方法的参数设置具体的类型,只使用一个标记表示,类使用的时候才动态地绑定一种数据类型,这就是范型. 如果应用使用了范型的类时没有指定类型,则会使用默认的类型Object. 1 ...
- 2.1 Java范型
1.简介 (1).概念 Java允许在定义方法.类和接口时不指定具体的数据类型,而是在范型方法被调用.范型类被实例化.范型接口被实现时再指定具体数据类型,这样便可以让数据类型变得参数化. (2).范型 ...
- java 解析注解_Java知识点总结(注解-解析注解)
Java知识点总结(注解-解析注解) @(Java知识点总结)[Java, 注解] 通过反射获取类.函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑. 使用注解步骤: 定义注解 类中使用注 ...
- java 反射.问题_Java知识点总结(反射-反射机制性能问题)
Java知识点总结(反射-反射机制性能问题) @(Java知识点总结)[Java, 反射] 性能相关注意点: setAccessible 启用和禁用访问安全检查的开关,值为 true 则指示反射的对象 ...
- java创建型_Java创建型模式
Java创建型模式 在软件工程中,创建型模式是处理对象创建的设计模式,试图根据实际情况使用合适的方式创建对象.基本的对象创建方式可能会导致设计上的问题,或增加设计的复杂度.创建型模式通过以某种方式控制 ...
- java 32位_Java知识点:创建节约内存的JavaBean
一个Java对象到底有多大? 想要精确计算一个Java对象占用的内存,首先要了解Java对象的结构表示. Java对象结构 一个Java对象在Heap的表示,可以分为三部分: Object Heade ...
- java lang型_java.lang的详解
java.lang包提供了利用 Java 编程语言进行程序设计的基础类,lang是单词language的开头.该包由Java语言自动调用,不需要显示声明. 一 接口 二 类 java.lang的类分为 ...
- java 虚拟机规范_Java虚拟机规范----Java虚拟机结构
Java体系和一些基本概念 Java平台的结构图: JVM与JRE.JDK关系? JVM:Java Virtual Machine(Java虚拟机),负责执行符合规范的Class文件 JRE: Jav ...
最新文章
- 这样设计订单系统,同事直呼 666!
- 原创 Reflector 8.1 反激活
- payara 创建 集群_使用Payara Micro的Easy Java EE Microservices
- Windows XP下Service的编程入门[2]
- HttpClient_用Apache HttpClient实现URL重定向
- VS 和 Eclipse 的一些快捷键记录
- java referencemap_Java中关于WeakReference和WeakHashMap的理解
- 树莓派 vnc Cannot currently show the desktop
- php微信上传图文素材,php使用curl 上传微信公共平台素材文件
- strpos php 中文,php strpos是什么
- php知识星球,解锁知识星球企业认证功能?重点看这6点
- 官方老爹之痛:为什么苹果能收到推送,而安卓不行?
- C语言 crc32校验算法原理,CRC循环冗余校验的实现原理
- Linux运维工程师是做什么的?运维发展前景到底怎么样?
- 基于实践的LabVIEW零基础入门视频教程
- 关于oracle数据库死锁的解决 以及产生的原因
- JAVA设计模式之——抽象工厂模式
- 【毕业设计】基于红外热释电的房间人数计数系统 - 单片机 物联网嵌入式
- jenkins git maven tomat 项目拉取编译自动部署(操作详细)
- 一文打败TCP/IP五层协议基础知识
热门文章
- iNeuOS云操作系统,.NET Core全系打造
- 恭贺微软技术俱乐部苏州站正式成立
- .NET 源代码库指南
- 基于Ocelot的gRpcHttp网关
- 使用VS Code 开发.NET Core 应用程序 部署到Linux 跨平台
- Django01-1: request 方法
- js对象数组中的某属性值 拼接成字符串
- 测量人看过来:多种语言编写的测量坐标反算神器附源码(C#/VB)
- SQL Server 2008 R2 Developer Edition图文安装教程
- Android之ndk编译出现这个错误error: unused variable ‘a‘ [-Werror=unused-variable]