一,泛型的应用
首先要明白泛型设置的目的是为了解决对象强制向下转型所带来的安全隐患。
其主要原理是在类声明时通过一个标识标识类中的某个属性类型或者某个方法的返回值及参数类型。
泛型类定义:
[访问权限] class 类名称<泛型类型标识 1,泛型类型标识 2,…>{
[访问权限] 泛型类型标识 变量名称;
[访问权限] 泛型类型标识 方法名称(){};
[访问权限] 返回值类型声明 方法名称(泛型类型标识 变量名称){};
}
泛型对象定义类名称 <具体类> 对象名称 = new 类名称<具体类>();
例子:
class Point<T>
{
private T var;
public T getvar(){
return var;
}
public void setVar(T var)
{
this.var=var;
}
}
public class one1 {
public static void main(String[] args) {
Point<String>point=new Point<String>();
point.setvar("李兴华");
System.out.print(point.getvar());
}
}
//运行结果为:李兴华
特别要注意的是在泛型中是无法直接使用基本数据类型的。
例如
//泛型类的定义与上方相同
public class one1 {
public static void main(String[] args) {
Point<Integer>point=new Point<Integer>();
point.setvar(20);
System.out.print(point.getvar()*2);
}
}
//运行结果为:40
//若把Integer改为int,则会报错,因此必须使用其包装类
其实也不难发现,加入泛型的最大好处就是避免了类转换异常的发生。
指定多个泛型类型
class Point<T,V>
{
private T x;
private V y;
public T getx()
{
return x;
}
public V gety()
{
return y;
}
public void setx(T x)
{
this.x=x;
}
public void sety(V y)
{
this.y=y;
}
}
public class one1 {
public static void main(String[] args) {
Point <Integer,String>point=new Point<Integer,String>();
point.setx(10);
point.sety("北纬20度");
System.out.print(point.getx()+point.gety());
}
}
//运行结果为:10北纬20度
在泛型应用中最好在声明类对象时就指定泛型具体类型,否则会出现警告信息,但并不影响程序的正常运行,因为所有的类型统一有Object进行接收。
在引用传递的泛型操作中也可以设置一个泛型对象的范围上限和范围下线。范围上限使用extends关键字声明,表示泛型的类型可能是所指定的类型或者是此类型的子类。
使用super关键字进行声明,表示泛型的类型可能是所指定的类型或者是此类型的父类。
在泛型操作中,子类的泛型类型无法使用父类的泛型类型接收,即不能使用向上转型。
二,泛型接口
声明泛型接口与声明泛型类的语法近似
interface Info<T>{
public T getvar(){};
}
泛型接口的实现有两种方法
一种是直接在子类之后声明泛型;另一种是直接在子类实现的接口中明确地给出泛型类型
泛型方法的定义与其所在的类是否是泛型类没有任何关系,所在的类可以是泛型类也可以不是泛型类。