黑马程序员之Java泛型浅说
2014-07-24 14:33
302 查看
1.泛型是我们需要的程序设计手段,使用泛型机制编写的程序代码要比那些杂乱的使用Object变量,然后再进行强制类型转换的代码具有更好的 安全性和可读性。尤其是对于集合类有用。在Java1.5后最大的变化莫过于增加了泛型机制。
在eclipse中,我们将java编译器的级别调制1.4及以下就会发下:(实例代码如下)我们所使用的ArrarList(此时不能使用泛型),List没有黄色警告部分,但是在进行get()的时候我们必须进行向下类型转换,才可以能够方便的使用放在ArrayList中的类型变量。如果在get()的时候不进行向下类型转换,这程序在编译的时候会产生错误。
import java.util.List;
import java.util.ArrayList;
public class ArrayListTest {
public static void main(String[] args) {
List list = new ArrayList();
list.add("String");
list.add(new Integer(2));
list.add(new Boolean(false));
list.add("String");
String str = (String) list.get(0);
Integer in = (Integer) list.get(1);// 向下类型转换
Boolean bl = (Boolean) list.get(2);
}
}
当我们把编译器的级别调制1.6以上的时候,在使用上述代码进行编译时候就会显示黄色警告信息:Add Type arguments to "ArrayList",提示我们进行变量类型的参数化,当上述代码进行变量类型参数化<String>后,我们发现list只能添加String类型量,而添加其他类型量后就会发生错误;同时在进行get()的时候,我们不必进行类型转换,便可以直接使用。
public class ArrayListTest {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("String");
// list.add(new Integer(2));//出错,不能添加Integer类型量
// list.add(new Boolean(false));//出错,不能添加Boolean类型量
list.add("String");
String str = list.get(0);
// Integer in = (Integer) list.get(1);
// Boolean bl = (Boolean) list.get(2);
}
}
2.类型变量的限定
有时候,我们需要的类和方法需要对类型变量加以约束,可以将<T>中的T限制实现了某一接口和是某一子类,那么我们就需要使用关键字extends对其进行限定:
<T extends BoundingType>.,表示T应该是绑定类型的子类型。T和绑定类型可以是类,也可以是接口。而选择extends作为关键字的原因是其更接近子类的概念。一个类型变量或通配符可以有多个限定,如: T extends Comparable & Serializable ;限定类型用“ & ”分隔,而用逗号来分隔类型变量。
希望下面程序会对你的理解有帮助。
public class ListGenericFoo<T extends List>{
private T[] fooArray;
public T[] getFooArray(){
return fooArray;
}
public void setFooArray(T[] fooArray){
this.fooArray = fooArray;
}
public static void main(String[] args){
ListGenericFoo<LinkedList> foo1 = new ListGenericFoo<LinkedList>();
ListGenericFoo<ArrayList> foo2 = new ListGenericFoo<ArrayList>();
LinkedList[] linkedList = new LinkedList[10];
foo1.setFooArray(linkedList);
ArrayList[] arrayList = new ArrayList[10];
foo2.setFooArray(arrayList);
}
在eclipse中,我们将java编译器的级别调制1.4及以下就会发下:(实例代码如下)我们所使用的ArrarList(此时不能使用泛型),List没有黄色警告部分,但是在进行get()的时候我们必须进行向下类型转换,才可以能够方便的使用放在ArrayList中的类型变量。如果在get()的时候不进行向下类型转换,这程序在编译的时候会产生错误。
import java.util.List;
import java.util.ArrayList;
public class ArrayListTest {
public static void main(String[] args) {
List list = new ArrayList();
list.add("String");
list.add(new Integer(2));
list.add(new Boolean(false));
list.add("String");
String str = (String) list.get(0);
Integer in = (Integer) list.get(1);// 向下类型转换
Boolean bl = (Boolean) list.get(2);
}
}
当我们把编译器的级别调制1.6以上的时候,在使用上述代码进行编译时候就会显示黄色警告信息:Add Type arguments to "ArrayList",提示我们进行变量类型的参数化,当上述代码进行变量类型参数化<String>后,我们发现list只能添加String类型量,而添加其他类型量后就会发生错误;同时在进行get()的时候,我们不必进行类型转换,便可以直接使用。
public class ArrayListTest {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("String");
// list.add(new Integer(2));//出错,不能添加Integer类型量
// list.add(new Boolean(false));//出错,不能添加Boolean类型量
list.add("String");
String str = list.get(0);
// Integer in = (Integer) list.get(1);
// Boolean bl = (Boolean) list.get(2);
}
}
2.类型变量的限定
有时候,我们需要的类和方法需要对类型变量加以约束,可以将<T>中的T限制实现了某一接口和是某一子类,那么我们就需要使用关键字extends对其进行限定:
<T extends BoundingType>.,表示T应该是绑定类型的子类型。T和绑定类型可以是类,也可以是接口。而选择extends作为关键字的原因是其更接近子类的概念。一个类型变量或通配符可以有多个限定,如: T extends Comparable & Serializable ;限定类型用“ & ”分隔,而用逗号来分隔类型变量。
希望下面程序会对你的理解有帮助。
public class ListGenericFoo<T extends List>{
private T[] fooArray;
public T[] getFooArray(){
return fooArray;
}
public void setFooArray(T[] fooArray){
this.fooArray = fooArray;
}
public static void main(String[] args){
ListGenericFoo<LinkedList> foo1 = new ListGenericFoo<LinkedList>();
ListGenericFoo<ArrayList> foo2 = new ListGenericFoo<ArrayList>();
LinkedList[] linkedList = new LinkedList[10];
foo1.setFooArray(linkedList);
ArrayList[] arrayList = new ArrayList[10];
foo2.setFooArray(arrayList);
}
相关文章推荐
- 黑马程序员_Java泛型
- 黑马程序员 java集合—泛型
- 黑马程序员java笔记之五-----泛型
- 黑马程序员java笔记之五-----泛型
- 黑马程序员_java之泛型
- 【黑马程序员】张孝祥Java高新技术_内省、注解、泛型
- [黑马程序员]--Java语言泛型机制
- 黑马程序员_JAVA学习日记_JAVA中的泛型
- 黑马程序员——JAVA(泛型)
- 黑马程序员_java中泛型(通配符)与反射技术
- 黑马程序员--Java注解以及泛型
- 黑马程序员Java基础之泛型(Genric)、拆箱与装箱、享元模式
- 黑马程序员学习笔记之五(java中的泛型)
- 黑马程序员_java基础6-集合框架Collection和泛型
- 黑马程序员-Java语言基础– 泛型 第15天
- 黑马程序员---转载关于java泛型的详细介绍
- 黑马程序员——Java1.5新特性之泛型
- 黑马程序员--java中的泛型。
- 黑马程序员________Java集合Map及其JDK1.5新特性泛型机制的学习笔记
- 黑马程序员 JAVA__高新技术--泛型总结