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)代替

泛型类

只能用在成员变量上,只能使用引用类型

泛型接口

只能用在抽象方法上

泛型方法

返回值前面加上 &ltT&gt

/**

* 自定义泛型类

*

* 定义"模版"的时候,泛型用泛型字母: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泛型)相关推荐

  1. java范形_java范型简介

    java范型简介 一.简单认识java范型 经常听人说"范型",我一直不是太明白什么叫"范型",今天就查阅了一些文章,给我的第一感觉就是之所以在java中用范型 ...

  2. Java范值_Java范型

    定义类的时候,不为类的属性或方法的参数设置具体的类型,只使用一个标记表示,类使用的时候才动态地绑定一种数据类型,这就是范型. 如果应用使用了范型的类时没有指定类型,则会使用默认的类型Object. 1 ...

  3. 2.1 Java范型

    1.简介 (1).概念 Java允许在定义方法.类和接口时不指定具体的数据类型,而是在范型方法被调用.范型类被实例化.范型接口被实现时再指定具体数据类型,这样便可以让数据类型变得参数化. (2).范型 ...

  4. java 解析注解_Java知识点总结(注解-解析注解)

    Java知识点总结(注解-解析注解) @(Java知识点总结)[Java, 注解] 通过反射获取类.函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑. 使用注解步骤: 定义注解 类中使用注 ...

  5. java 反射.问题_Java知识点总结(反射-反射机制性能问题)

    Java知识点总结(反射-反射机制性能问题) @(Java知识点总结)[Java, 反射] 性能相关注意点: setAccessible 启用和禁用访问安全检查的开关,值为 true 则指示反射的对象 ...

  6. java创建型_Java创建型模式

    Java创建型模式 在软件工程中,创建型模式是处理对象创建的设计模式,试图根据实际情况使用合适的方式创建对象.基本的对象创建方式可能会导致设计上的问题,或增加设计的复杂度.创建型模式通过以某种方式控制 ...

  7. java 32位_Java知识点:创建节约内存的JavaBean

    一个Java对象到底有多大? 想要精确计算一个Java对象占用的内存,首先要了解Java对象的结构表示. Java对象结构 一个Java对象在Heap的表示,可以分为三部分: Object Heade ...

  8. java lang型_java.lang的详解

    java.lang包提供了利用 Java 编程语言进行程序设计的基础类,lang是单词language的开头.该包由Java语言自动调用,不需要显示声明. 一 接口 二 类 java.lang的类分为 ...

  9. java 虚拟机规范_Java虚拟机规范----Java虚拟机结构

    Java体系和一些基本概念 Java平台的结构图: JVM与JRE.JDK关系? JVM:Java Virtual Machine(Java虚拟机),负责执行符合规范的Class文件 JRE: Jav ...

最新文章

  1. 这样设计订单系统,同事直呼 666!
  2. 原创 Reflector 8.1 反激活
  3. payara 创建 集群_使用Payara Micro的Easy Java EE Microservices
  4. Windows XP下Service的编程入门[2]
  5. HttpClient_用Apache HttpClient实现URL重定向
  6. VS 和 Eclipse 的一些快捷键记录
  7. java referencemap_Java中关于WeakReference和WeakHashMap的理解
  8. 树莓派 vnc Cannot currently show the desktop
  9. php微信上传图文素材,php使用curl 上传微信公共平台素材文件
  10. strpos php 中文,php strpos是什么
  11. php知识星球,解锁知识星球企业认证功能?重点看这6点
  12. 官方老爹之痛:为什么苹果能收到推送,而安卓不行?
  13. C语言 crc32校验算法原理,CRC循环冗余校验的实现原理
  14. Linux运维工程师是做什么的?运维发展前景到底怎么样?
  15. 基于实践的LabVIEW零基础入门视频教程
  16. 关于oracle数据库死锁的解决 以及产生的原因
  17. JAVA设计模式之——抽象工厂模式
  18. 【毕业设计】基于红外热释电的房间人数计数系统 - 单片机 物联网嵌入式
  19. jenkins git maven tomat 项目拉取编译自动部署(操作详细)
  20. 一文打败TCP/IP五层协议基础知识

热门文章

  1. iNeuOS云操作系统,.NET Core全系打造
  2. 恭贺微软技术俱乐部苏州站正式成立
  3. .NET 源代码库指南
  4. 基于Ocelot的gRpcHttp网关
  5. 使用VS Code 开发.NET Core 应用程序 部署到Linux 跨平台
  6. Django01-1: request 方法
  7. js对象数组中的某属性值 拼接成字符串
  8. 测量人看过来:多种语言编写的测量坐标反算神器附源码(C#/VB)
  9. SQL Server 2008 R2 Developer Edition图文安装教程
  10. Android之ndk编译出现这个错误error: unused variable ‘a‘ [-Werror=unused-variable]