Java基础笔记:泛型

内容:Java中的泛型

优秀文章:
新浪博客-海洋星球:http://blog.sina.com.cn/s/blog_44c1e6da0100cus3.html
书籍:细说Java、疯狂Java讲义

说明:
泛型是于Java SE1.5添加的新特性;
泛型的本质是参数化类型,简单来说就是将泛型看作一个或多个参数,使用这个参数的代码片段可以由任何具体类类型的参数来替换;
泛型的参数类型只能是类类型,不能是简单类型(简单类型是指不能再简化的编程语言内置数据类型,java中有实数-float-double、整数-byte-short-int-long、字符-char、布尔值-boolean); 
泛型可以用于接口(成员属性)、类(成员属性)、方法(返回值)的定义中,分别称作泛型接口、泛型类、泛型方法;
泛型的使用可以提高代码的重用性;
泛型信息主要作用于编译阶段,对于运行时期,泛型的信息则会丢失(类型擦除); 
泛型常用与集合中;

使用:
1.确保数据的合法性(集合中存放元素时不会对存放的数据进行判断,即不同的数据类型可以毫无区分的存入集合中);
2.集合元素的类型指定(集合中已存入的元素默认情况下都是Ob类型,因此每次取值时都需要进行数据转换,且每个元素的数据类型都要清楚的知晓);

 1 import java.util.LinkedList;
 2 import java.util.List;
 3
 4
 5 public class DemoList {
 6     //传统程序
 7     public List getList01(){
 8         List list = new LinkedList();
 9         //任何值都可以存入集合,若取值时转化有误,则产生异常;
10         list.add("一");
11         list.add(2);
12         return list;
13     }
14     //使用泛型
15     public List<String> getList02(){
16         List<String> list = new LinkedList<String>();
17         //非参数类型值不可存,限制了集合的元素类型;
18         list.add("one");
19         list.add("tow");
20         return list;
21     }
22
23     public static void main(String[] args) {
24         // TODO Auto-generated method stub
25         DemoList dl = new DemoList();
26         List l1 = dl.getList01();
27         //每次取值都需要进行强转
28         String s0 = (String)l1.get(0);
29         int s1 = (int) l1.get(1);
30         System.out.println(s0+s1);
31
32         List<String> l2 = dl.getList02();
33         //取值的时候不需要转化
34         String s3 = l2.get(0);
35         String s4 = l2.get(1);
36         System.out.println(s3+s4);
37     }
38 }

泛型中的类型擦除
java中实质是不存在泛型类型对象的,JVM也根本不支持泛型类型,泛型类在经过JVM编译后生成的.class文件实为原始类型,泛型类型参数列表被去掉,JVM用类型参数的限定类型对类型参数进行替换;
因为类型擦除,所以:
不能用类型参数替换基本类型;
运行时的类型检查只检查泛型类的原始类型;
不能抛出也不能捕获泛型类的对象;
不能声明参数化类型的数组;
不能实例化未制定泛型类型的对象;
不能在静态域或者静态方法中引用类型变量;
泛型方法与原始方法的同名冲突;

 1 import java.util.LinkedList;
 2 import java.util.List;
 3
 4
 5 public class Tset {
 6
 7     public static void main(String[] args) {
 8         // TODO Auto-generated method stub
 9         List l1 = new LinkedList();
10         List<String> l2 = new LinkedList<String>();
11         List<StringBuilder> l3 = new LinkedList<StringBuilder>();
12         if(l1.getClass()==l2.getClass()){
13             System.out.println("l1与l2类型相同");
14             System.out.println("l1类型为"+l1.getClass().toString());
15             System.out.println("l2类型为"+l2.getClass().toString());
16         }
17         if(l1.getClass()==l3.getClass()){
18             System.out.println("l1与l3类型相同");
19             System.out.println("l1类型为"+l1.getClass().toString());
20             System.out.println("l3类型为"+l3.getClass().toString());
21         }
22         if(l2.getClass()==l3.getClass()){
23             System.out.println("l2与l3类型相同");
24             System.out.println("l2类型为"+l2.getClass().toString());
25             System.out.println("l3类型为"+l3.getClass().toString());
26         }
27
28     }
29
30 }

泛型与参数类型
泛型是基于类本身的,而不是基于参数类型,即存在继承关系的两个泛型类对象并不兼容;

1     List<Number> list = new LinkedList<Number>();
2     List<Byte> list2 = new LinkedList<Byte>();
3     list = list2;//错误!  

使用类型通配符<?>可以使泛型无边界,使用extends<? extends 父类>或super<? super 父类>可以限定泛型的类型;

1     public void printList(List<?> list);//接收任何参数类型;
2     public void printList(List<? extends Number> list);//接收Number或Number子类型;
3     public void printList(List<? super Number> list);//接收Number或Number父类型; 
时间: 2024-10-12 22:52:37

Java基础笔记:泛型的相关文章

Java基础巩固----泛型

注:参考书籍:Java语言程序设计.本篇文章为读书笔记,供大家参考学习使用   1.使用泛型的主要优点是能够在编译时而不是在运行时检查出错误,提高了代码的安全性和可读性,同时也提高了代码的复用性. 1.1如何理解泛型的使用提高了代码的安全性? 答:例如这样一段代码: ArrayList<Date> arrayList = new ArrayList<Date>(); arrayList.add(new Date()); arrayList.add("data")

[Java基础笔记]数组

Java基础笔记 定义数组: int[] numbers = new int[100]; //方法一 double[] num = new double[10]; int[][] a = new int[2][5]; 通过new创建的数组,元素默认值为0(0.0) int[] scores = {5,4,33,12,46}; //方法二 int[][] a = { //位数不足,自动补0 {5,3,2,1,6}, {10,12,14,15}, }; 数组特性:存储的都是同类型数据:长度定义后不可

java基础之泛型用法

1.什么是泛型 泛型是java中保障类型安全的一种机制.它通过对变量类型的假设,实现变量类型的进行限制,从而在一定程度上保证程序编译时变量类型的安全.反之,如果没有泛型,这些假设则只存在于程序员的大脑中,这样会导致类型转换的异常在程序运行时才被发现. //不用泛型 List list1 = new ArrayList(); list1.add(1); Object o = list1.get(0); //返回Object类型对象 Integer i = (Integer) o; //需预先知道类

java 基础笔记 基本数据类型对象包装类

基本数据类型对象包装类: 为了方便操作基本数据类型值,将其封装成了对象,在对象中定义了属性和行为丰富了该数据的操作. 用于描述该对象的类就称为基本数据类型对象包装类. 基本数据类型 包装类 byte Byte short Short int Integer long Long float Float double Double char   Character boolean Boolean 该包装对象主要用于基本类型和字符串之间的转换. 基本类型-->字符串 1.基本类型数据+"&quo

Java基础:泛型

Java的泛型是什么呢, 就是类型的参数化,这得类型包括方法参数和返回值,也就是原本该是确定类型的地方换成了变量,把类型的确定时间向后延迟了. 在之前,学过"重载"的概念,重载是什么呢,举例来说 public class Test{ // 处理整型数据 void receive(int i) { System.out.println("Received one int data"); System.out.println("i="+i); } /

Java基础笔记 – Annotation注解的介绍和使用 自定义注解

Java基础笔记 – Annotation注解的介绍和使用 自定义注解 本文由arthinking发表于5年前 | Java基础 | 评论数 7 |  被围观 25,969 views+ 1.Annotation的工作原理:2.@Override注解:3.@Deprecated注解:4.@SuppressWarnings注解:5.自定义注解:5.1.添加变量:5.2.添加默认值:5.3.多变量使用枚举:5.4.数组变量:6.设置注解的作用范围:6.1.在自定义注解中的使用例子:7.使用反射读取R

【转】Java基础笔记 – 枚举类型的使用介绍和静态导入--不错

原文网址:http://www.itzhai.com/java-based-notes-introduction-and-use-of-an-enumeration-type-static-import.html#1.2.values方法的使用: Java基础笔记 – 枚举类型的使用介绍和静态导入 本文由arthinking发表于4年前 | Java基础 | 暂无评论 |  被围观 8,332 views+ 1.枚举(Enum):1.1.枚举类型中的两个静态方法:1.2.values方法的使用:

java基础之泛型的继承

关于泛型的基本介绍和理解请参考以下几篇文章,或查询更多资料: 泛?型?与?泛?型?继?承 泛型(包括泛型抽象类的继承) 泛型的继承测试 本篇以简单的List<>方式来进行说明. ArrayList<Object>继承了List<Object>, ArrayList<String>没有继承List<Object> List<?>等价于List<? extends Object> 请参考以下代码: /** * author D

黑马程序员----java基础笔记中(毕向东)

<p>------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! -------</p><p> </p><p>笔记一共记录了毕向东的java基础的25天课程,分上.中.下</p><p>本片为中篇,涵盖11-20天课程</p&