Java泛型

泛型本质是将类、接口和方法中具体的类型参数化,并且提供了编译时类型安全检测机制。
通过使用泛型,可以避免使用Object类导致的类型转换错误和减少了代码的冗余。
尖括号“<>”是泛型的标志

泛型的范围

泛型接口,泛型类(创建对象时再指定具体类型),泛型方法。
实现方式:以泛型类举例。我们只需要在类名后面使用尖括号<>将一个符号或多个符号包裹起来,这样在类里面就可以使用该符号代替具体类型了。
使用泛型类时,调用者实际传进来什么类型,编译时就会将泛型符号擦除,替换成这个实际类型。
泛型符号可以是任意符号,但我们约定使用T、E、K、V等符号。

为什么要有泛型,而不是使用Object类?

因为泛型是在编译时泛型擦除和替换实际类型的,而使用Object类会很麻烦,需要经常强制转换。
例如List集合里,如果直接声明存Object类的话,存的时候还好,可以通过多态机制直接向上转型,而取的时候就麻烦了,要强转Object类为String等对象,然后才能访问该对象的成员;
而且你不知道实际元素到底是String类型还是Integer等其他类型,还要通过i instanceof String判断类型,就更麻烦了。

泛型的优点

1.防止运行时报错:可以在编译时检查类型安全,防止在程序运行期间出现BUG。
2.隐式转换:所有的强制转换都是自动和隐式的,可以提高代码的重用率。

泛型参数类型的惯例

:表示元素(Element),通常在集合类中使用。例如,List,Set。
:表示类型(Type),通常在一般类型中使用。例如,Box,Comparable。
和 :分别表示键(Key)和值(Value),通常在映射(Map)类中使用。例如,Map,Entry
:表示数字(Number),在需要表示数字的泛型中使用。

泛型类:定义了一个泛型参数,创建对象时给它传入这个参数的实际类型

class ClassName {
	// 成员变量、构造方法和方法可以使用类型参数T
}

泛型接口:和泛型类类似,也是定义了一个泛型参数。不同的点是,泛型接口在被实现或者被继承时需要指定具体类型。

如果泛型接口的实现类不是泛型:
实现泛型接口时,如果没有省略尖括号“<>”,则必须在接口“<>”中指定类型
实现泛型接口时,如果省略了尖括号“<>”,则默认“<>”内是Object类

如果泛型接口的实现类是泛型:
实现泛型接口时,实现类也必须是泛型类,并且类型与泛型接口保持一致

泛型方法
当在一个方法签名中的返回值前面声明了一个 < T > 时,该方法就被声明为一个泛型方法。
然后返回类型、参数类型都可以用这个,当然也可以不用

类型通配符

:无限定的通配符。可以用来表示任何类型。无限定通配符只能读Object类型的值,只能写null类型的值,其他类型都不能读写。 :有上界的通配符。表示继承自T的任何类型,这里上界指的就是T。它通常用于生产者,即返回T。上界通配符只允许读值,不允许写null以外值。 :有下界的通配符。表示子类是T的任何类型,这里下界指的就是T。它通常用于消费者,即写入T。下界类型通配符只允许写值,不允许读Object以外的值。 ## 泛型擦除 泛型擦除:java的泛型是伪泛型,这是因为java在编译期间,所有的泛型类型都会被擦掉,并转换为普通类型

你可能感兴趣的:(Java泛型)