Java学习泛型之我见

今天学习了泛型,初看泛型,让我感觉有点像C++里的类模板,可以根据具体需求来改变参数的类型,但是看似相似,却实则不同,Java的泛型本质上是参数化类型

使用场景:如果定义的一个类或接口有一个或多个类型变量 (不确定的类型),则可以使用泛型。泛型类型变量由尖括号界定,放在类或接口名的后面。我们将泛型所在的类叫泛型类,泛型所在的借口叫泛型接口,泛型所在的方法叫泛型方法

泛型的符号,任意,无意义,习惯用大写T、K、V字母表示。泛型代码举例:

//泛型类
public static class A<T>{

}
//泛型接口
public interface B<T>{

}
//泛型方法
public static <T>void f(T x) {

}
public void test(A<?> a) {

}

泛型方法可以是静态的,但是使用泛型的方法不能是静态的

注意:

1.在定义一个泛型类时,在 <> 之间定义形式类型参数,例如:class A<T> ,其中T 不代表值,而是表示类型。

2.使用泛型时,泛型类型必须为引用数据类型,不能为基本数据类型;Java中的普通方法,构造方法中都可以使用泛型,方法使用泛型之前必须先对泛型进行声明,可以使用任意字母,一般都要大写。

3.不可以用泛型构造对象,即: first = new T()。

4.在static方法中不可以使用泛型,泛型变量也不可以用static关键字来修饰;如果一个静态方法需要使用泛型的话,该方法需要定义成泛型方法。

泛型具有一个通配符,解决了方法对泛型实例进行分别处理的问题,具体代码如下:

public class Test {
public static void main(String[] args) {

Person<String> p = new Person<>();
Person<Object> p1 = new Person<>();
new Test().test(p1);
new Test().test(p);

}

public void test(Person<?> p){

}

}

class Person<T>{

}

这样就可以通过通配符,让test方法既能解决String类型,又能解决Object类型。

泛型还有一个上下边界,为泛型添加上边界,即传入的类型实参必须是指定类型的子类型,或者为泛型添加下边界,即传入的类型必须是指定类型的父类型。

简单来说就是,通配符?传入的类型在extends限制下不能给所各类型的父类,必须给子类,即上边界;

同理传入的类型在super限制下不能给所各类型的子类,必须给子父类,即下边界。代码如下:

public class Test {
public static void main(String[] args) {
Person<Employee> p1 = null;
Person<Object> p2 = null;
Person<Manager> p3 = null;
new Test().testD(p1);
new Test().testD(p2);
// new Test().testD(p3);
}
// 泛型类指定上边界
public void testU(Person<? extends Employee> p){}
// 泛型类指定下边界
public void testD(Person<? super Employee> p){}
}

class Person<T>{}
class Manager extends Employee{}

最后就是泛型的作用:

第一是泛化。

可以用T代表任意引用类型,Java语言中引入泛型是一个较大的功能增强,不仅语言、类型系统和编译器有了较大的变化,以支持泛型,而且类库也进行了大翻修,所以许多重要的类,比如集合框架,都已经成为泛型化的了,这带来了很多好处。

第二是类型安全。

泛型的一个主要目标就是提高ava程序的类型安全,使用泛型可以使编译器知道变量的类型限制,进而可以在更高程度上验证类型假设。 如果不用泛型,则必须使用强制类型转换,而强制类型转换不安全,在运行期可能发生ClassCastException异常,如果使用泛型,则会在编译期就能发现该错误。

第三是消除强制类型转换。

泛型可以消除源代码中的许多强制类型转换,这样可以使代码更加可读,并减少出错的机会。

第四是向后兼容。

支持泛型的Java编译器(例如JDK1.5中的Javac)可以用来编译经过泛型扩充的Java程序(Generics Java程序),但是现有的没有使用泛型扩充的Java程序仍然可以用这些编译器来编译。

 所有代码都已经上传,想要学习请自行下载(免费开源0积分)。

总结:当你觉得学习很累的话,说明你正在前进!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值