我先对java泛型的注意点还有作用,优势做一个简单的阐述
1. java 泛型参数只能是类类型(如Integer,String,还有一些类类型 ),不能是简单类型.
2.泛型可以说明任何实例方法中的局部变量,类的成员变量,方法的形式参数,以及方法的返回值.
3.泛型 保证的对象间类型转换的安全,也简化了过程,不必在Object类和实际操作的数据类型之间进行强制类型转换.
4.泛型可以将所有的对象强制类型转换成自动转型和隐式类型,泛型扩展了重复使用代码的能力,而且既安全又简单.
范例一:在没有泛型时,大家都会遇到如下问题.
class Apple
{
private static long counter;
private final long id = counter++;
public long id()
{
return id;
}
}
class Orange{}
class Test
{
public static void main(String[]args)
{
ArrayList arrayList = new ArrayList();
//可以想ArrayList中添加任何对像,在编译期和运行期没有任何错误
for(int i=0;i<3;i++)
{
arrayList.add(new Apple()); }
arrayList.add(new Orange());
for(int i=0; <arrayList.size();i++)
{
Object obj = arrayList.get(i);
//必须进行强制类型转换
Apple apple = ((Apple)arrayList.get(i)).id();
//当将Orange对象转换为Apple时报错
}
}
}
范例分析: Apple类和Orange 类除了继承自Object ,两个类是完全不同的类(如果一个类没有明确继承自那个类,那么他自动继承自Object类)
因为ArrayList 保存的是Object类,因此你不仅可以通过ArrayList 中的Add()方法添加Apple对象 还可以添加Orange对象.无论是在
编译期还是运行期都不会有问题. 当你用ArrayList的get()方法取出你认为是Apple 对象的方法时,你得到的只是Object 的引用,必须
将其强制转型为Apple,否责会有语法错误.当将Orange 转型为Apple时,就会右语法错误.
范例二:用泛型来解决范例一中,不安全,类型转换,问题,代码如下
class Test2
{
public static void main(String[]args)
{
ArrayList<Apple> arrayList = new ArrayList<Apple>();
for(int i=0; i<3;i++)
arrayList.add(new Apple());
//不能向ArrayList 中添加Orange对象,泛型已经确定是Apple对象
arrayList.add(new Orange());
//从ArrayList中取出对象,并调用对象的方法
for(int i= 0;i<arrayList.size();i++)
{
//将不需要进行强制类型转换
System.out.println(arrayList.get(i).id());
}
for(Apple c: arrayList)
{
System.out.println(c.id());
}
}
}
范例三:当你指定某个类型作为泛型参数时,你并不仅限于只能将该确切类型的对象放置到容器中,向上转型也可以像作用与其他类型一样作用于泛型
class a1 extends Apple{}
class a2 extends Apple{}
class a3 extends Apple{}
class Test
{
public static void main(String[]args)
{
ArrayList<Apple> arrayList = new ArrayList<Apple>();
arrayList.add(new a1());
arrayList.add(new a2());
arrayList.add(new a3());
for(Apple c : arrayList)
{
System.out.println(c);
}
}
}
范例三:自定义泛型类
public class MyFirstGeneric<T>
{
T t;
MyFirstGeneric(T t1)
{
t = t1;
}
T getT()
{
return t;
}
void printType()
{
System.out.println(t.getclass.getName());
}
public static void main(String[]args)
{
MyFirstGeneric<String> str = new MyFirstGeneric<String>("sdd");
str.printType();
String string = str.getT();
MyFirstGeneric<Date> date = new MyFirstGeneric<Date>(new Date());
date.printType();
Date d = date.getT();
}
}