java SE 泛型
来源:互联网 发布:网络与新媒体真的好吗 编辑:程序博客网 时间:2024/05/17 23:21
摘自毕向东的java SE视频,这里要特别赞一下这个视频,真的很不错。
很多视频的讲解都会专门讲一下JDK基本数据类型自动装箱的功能。
同时,泛型也是JDK 1.5之后出现的特性。
首先用于解决类型安全问题。
数组的安全性比较好,如定义时 int[] x = {1,2,3};如果放入了非int类型值,在编译期间就会报错,而非运行期。
如果使用集合,如
ArrayList a = new ArrayList();
a.add(new String("abc")); //添加一个String对象
a.add(4); //添加一个Interger对象
//Type safety: The method add(Object) belongs to the raw type ArrayList. References to //generic type ,ArrayList<E> should be //parameterized。在eclipse中,会有这个warn提示,提示类型安全。提示增加数据类型。
a.add(4)后,编译期间不会报错,会在运行期间报错。
如果使用泛型,
ArrayList<String> al = new ArrayList<String> ();
则可以:
1. 将问题从运行期转移到了编译期,方便于程序员解决问题;
2. 避免了强制类型转换的问题,(迭代时Iterator,放在迭代器中的是Object)
而且,在javac编译时,警告消息会显示
泛型格式:通过<>来定义要操作的引用类型
在使用java提供的对象时,什么时候写泛型呢?通常是在集合框架中使用。
只要定义<>,就要使用泛型。如API中ArrayList<E>, add(E e)方法。
当使用集合时,将集合要使用的数据类型传到<>即可。
迭代器、比较器、集合,都是用泛型了。
----------泛型类-------------
泛型定义在类上。
class Tool<T> //泛型类
{
private T t;
public T getObject()
{
return t;
}
public void setObject(T t)
{
this.t = t;
}
}
使用时,Util<Worker> util = new Util<Worker>; util.setObject(new Worker());
定义泛型类:
当类中要操作的引用数据类型不确定时,早期定义Object来完成扩展;而现在使用泛型来完成扩展
泛型类定义的泛型,在整个类中有效;如果被方法调用,那么泛型的类的对象明确要操作的具体类型后,所有要操作的类型就固定了。
class Demo
{
public <T> void show(T t) //注意把泛型定义在方法上的格式
{
System.out.println();
}
public <T> void print(T t)
{
System.out.println();
}
}
//静态方法不可以访问类上定义的泛型。如
class Demo<T>
{
public <T> void print(T t)
{
System.out.println();
}
public static void soft(T t)
{
System.out.println(t);
}
}
//eclipse中报错,Cannot make a static reference to the non-static type T
如果静态方法操作的应用数据类型不确定,可以讲泛型定义在方法上。
public static <T> void soft(T t)
{
System.out.println(t);
}
-----------泛型定义在接口上------------------------
interface Inter<T>
{
void show(T t);
}
class InterImpl<T> implements Inter<T>
{
public void show(T t)
{
System.out.println("show : "+t);
}
}
------------泛型限定--------------------------
通配符ArrayList<?>,<?>是个占位符,说明这里有泛型。
public static void printColl(ArrayList<String> a1)
{
Iterator<String> it = a1.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
如果打印ArrayList<String>类型容器,可以使用这个函数;但如果另外还想打印ArrayList<Interger>类型变量,则可以使用ArrayList<?>,通配符?表示。
public static void printColl(ArrayList<?> a1) //考虑T和?的区别。
{
Iterator<?> it = a1.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
这时,就可以往函数传入Integer和String类型ArrayList。
如ArrayList<? Extends Person>,泛型限定
上限,下限
<? extends E>,上限
<? super E>,接收E类型和E的父类,下限
很多视频的讲解都会专门讲一下JDK基本数据类型自动装箱的功能。
同时,泛型也是JDK 1.5之后出现的特性。
首先用于解决类型安全问题。
数组的安全性比较好,如定义时 int[] x = {1,2,3};如果放入了非int类型值,在编译期间就会报错,而非运行期。
如果使用集合,如
ArrayList a = new ArrayList();
a.add(new String("abc")); //添加一个String对象
a.add(4); //添加一个Interger对象
//Type safety: The method add(Object) belongs to the raw type ArrayList. References to //generic type ,ArrayList<E> should be //parameterized。在eclipse中,会有这个warn提示,提示类型安全。提示增加数据类型。
a.add(4)后,编译期间不会报错,会在运行期间报错。
如果使用泛型,
ArrayList<String> al = new ArrayList<String> ();
则可以:
1. 将问题从运行期转移到了编译期,方便于程序员解决问题;
2. 避免了强制类型转换的问题,(迭代时Iterator,放在迭代器中的是Object)
而且,在javac编译时,警告消息会显示
泛型格式:通过<>来定义要操作的引用类型
在使用java提供的对象时,什么时候写泛型呢?通常是在集合框架中使用。
只要定义<>,就要使用泛型。如API中ArrayList<E>, add(E e)方法。
当使用集合时,将集合要使用的数据类型传到<>即可。
迭代器、比较器、集合,都是用泛型了。
----------泛型类-------------
泛型定义在类上。
class Tool<T> //泛型类
{
private T t;
public T getObject()
{
return t;
}
public void setObject(T t)
{
this.t = t;
}
}
使用时,Util<Worker> util = new Util<Worker>; util.setObject(new Worker());
定义泛型类:
当类中要操作的引用数据类型不确定时,早期定义Object来完成扩展;而现在使用泛型来完成扩展
泛型类定义的泛型,在整个类中有效;如果被方法调用,那么泛型的类的对象明确要操作的具体类型后,所有要操作的类型就固定了。
---------------定义在方法上的泛型------------------------
class Demo
{
public <T> void show(T t) //注意把泛型定义在方法上的格式
{
System.out.println();
}
public <T> void print(T t)
{
System.out.println();
}
}
//静态方法不可以访问类上定义的泛型。如
class Demo<T>
{
public <T> void print(T t)
{
System.out.println();
}
public static void soft(T t)
{
System.out.println(t);
}
}
//eclipse中报错,Cannot make a static reference to the non-static type T
如果静态方法操作的应用数据类型不确定,可以讲泛型定义在方法上。
public static <T> void soft(T t)
{
System.out.println(t);
}
-----------泛型定义在接口上------------------------
interface Inter<T>
{
void show(T t);
}
class InterImpl<T> implements Inter<T>
{
public void show(T t)
{
System.out.println("show : "+t);
}
}
------------泛型限定--------------------------
通配符ArrayList<?>,<?>是个占位符,说明这里有泛型。
public static void printColl(ArrayList<String> a1)
{
Iterator<String> it = a1.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
如果打印ArrayList<String>类型容器,可以使用这个函数;但如果另外还想打印ArrayList<Interger>类型变量,则可以使用ArrayList<?>,通配符?表示。
public static void printColl(ArrayList<?> a1) //考虑T和?的区别。
{
Iterator<?> it = a1.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
这时,就可以往函数传入Integer和String类型ArrayList。
如ArrayList<? Extends Person>,泛型限定
上限,下限
<? extends E>,上限
<? super E>,接收E类型和E的父类,下限
- java SE 泛型
- Java SE 基础:泛型
- java se
- Java SE
- java se
- java se
- java se
- JAVA SE
- JAVA SE
- 《Java SE》初学Java
- 【Java SE】认识Java
- Java SE 中的技术
- Java SE 简单介绍
- JAVA SE学习笔记
- JAVA SE 相关
- Java SE 6 Beta
- Java SE -- Static Inner
- Java SE -- 多态
- [Cexpert-003] You should remember some of ASCII!
- 日期控件设置最小值
- 普通文件的下载函数
- OpenGL笔记之windows环境搭建
- C++第七周【任务3】设计Complex,使实部和虚部的类型为定义对象时用的实际类型。
- java SE 泛型
- Gauss_Seidel
- 给浮躁的软件业同仁
- 如何在一台机子上启动两个TOMCAT
- hduoj2063:过山车
- 函数调用方式
- 位操作/指针和数组/字符串
- printf函数实现
- Chap 9:指针