------- android培训、java培训、期待与您交流! ----------
在jdk1.5之后java出现了泛型,允许定义泛型类,接口,方法。
例如Comparable接口:
//在1.5之前的定义,是用Object来接受的。
public interface Comparable{
public int CompareTo(Object o)
}
//有了泛型之后:
public interface Comparable<T>
{
public int CompareTo(T t)
}
由上面可以感到泛型的区别,当然泛型的主要作用是:可以在编译时检测出错误!
1.如何定义泛型类呢?如下:
class person<T>
{
person()
{
}
public void sayhi(T t)
{
System.out.println(t+"hi");
}
}
也就是说在定义为泛型类时候,所有类中的T都可以是使用T相应的值。要区别的是泛型方法的定义!
2.如何定义泛型接口?如下
interface person<T>
{
public void sayhi(T t);
}
· 3.如何定义泛型方法?如下
public <E> void print(E e)
{
System.out.println(e);
}
在泛型方法中要注意返回值类型前的<E>!区别于泛型类。
------------------------------------------------------------------------------
在泛型中也有许多要注意的问题:
1.当你的GenericDemo<T>为一个泛型类的时候,你的构造方法用不用加<T>?不用!为GenericDemo()不加泛型类型!
2.泛型可以有多个参数<E,E1,E2>
3.非受限的类型<T>和<T extends Object>一样!
4.通配符? 可以接受任意类型!
? extends E 表示接受E类型或E的子类型!
? super E 表示接受E的父类型!
5.尽管Integer为Object的子类型,但是GenericDemo<Integer>不是GenericDemo<Object>的子类型!
要注意的一点是什么时候不能用泛型:
1.在静态环境下,不可以用泛型!
2.在异常类中不可用泛型!
无论怎么样,都由于泛型的特殊实现方式决定的:泛型是使用一种类型消除的方法实现的!编译器使用泛型类型信息,来编译。但是之后消除他!因此,在运行时是没有泛型的信息的!
在think in java中写道:
java容器缺陷,和泛型作用:
1.对象引用加入容器的时候丢了类型信息!
2.由于丢失了类信息,所以要类型转换,转为正确类型!
------- android培训、java培训、期待与您交流! ----------