在深入了解泛型之前我们先来回忆一下向上转型和向下转型,结合以下代码来看:
public class TestF{
private Object b;
public Object getB(){
return b;
}
public void setB(Object b){
this.b=b;
}
public static void main(String[] args){
TestF t=new TestF();
//向上转型
t.setB(new Boolean(true));
//向下转型:getB()方法返回的是Object类型的,却以Boolean类型返回;
System.out.println(t.getB());
t.setB(new Float(12.4));
Float f=(Float)(t.getB());
System.out.println(f);
}
}
编译运行后输出:
true
12.4
在上述代码中,TestF类定义了私有的成员变量b,类型为Object类,同时为其定义了getB()和setB()方法。在主方法中,将new Boolean(true)对象作为setB()方法的参数,由于setB()方法的参数类型为Object类型,而new Boolean(true)对象为Boolean类型,因此就实现了向上转型操作。同时在调用getB()方法时,将getB()方法返回的Object对象以相应的Boolean类型返回,因此实现了向下转型操作。向上转型是安全的,但是向下转型如果用错了类型,或没有执行该操作,通常会报异常,如下将上面的代码修改一下:
public class TestF{
private Object b;
public Object getB(){
return b;
}
public void setB(Object b){
this.b=b;
}
public static void main(String[] args){
TestF t=new TestF();
//向上转型
t.setB(new Boolean(true));
//向下转型:getB()方法返回的是Object类型的,却以Boolean类型返回;
System.out.println(t.getB());
t.setB(new Float(12.4));
Integer f=(Integer)(t.getB());
System.out.println(f);
}
}
编译运行后输出:
true
Exception in thread "main" java.lang.ClassCastException: java.lang.Float cannot be cast to java.lang.Integer
at TestF.main(TestF.java:16)
Object类为最上层的父类,很多程序员为了使程序更为通用,通常程序传入的值与返回的值都为Object类型,但在需要使用这些实例时,必须正确地将该实例转换为原来的类型,否则就会报ClassCastException异常。
接下来使用泛型对第一个代码进行修改,代码如下:
public class OverClass{
private T over;
public T get(){
return over;
}
public void set(T over){
this.over=over;
}
public static void main(String[] args){
OverClass over1=new OverClass();
OverClass over2=new OverClass();
over1.set(true);
System.out.println(over1.get());
over2.set(12.3f);
System.out.println(over2.get());
}
}
在上述代码中,定义OverClass类时,后面加了一个,这里便引用了泛型机制,OverClass便称为泛型类,同时返回和接受的参数使用T这个类型。最后在主方法中使用OverClass形式返回一个Boolean类型的对象,使用OverClass形式返回一个Float类型的对象,不需要进行向上转型和向下转型操作。
今天的内容就讲到这里,觉得有用的话,欢迎分享给更多的人!