java 泛型基础学习

泛型

简介

泛型就是将类型也当作参数来使用,基本类型是不能当作泛型参数传递的,泛型也不能用于显示的引用运行时类型的操作之中例如转型、instacceof和new。

泛型类

泛型也可用于内部类和匿名内部类

class A <T>
{
	
}

使用泛型类

继承一个泛型类时既可以继承泛型也可以不用,当我们使用泛型类创建对象时必须指明泛型信息,一个类不能实现一个泛型接口的两种变体,由于擦除这两个变体会变成相同的接口。

泛型接口

interface A<T>
{
}

使用泛型接口

继承或实现一个接口时既可以继承泛型也可以不用

泛型方法

一个类是否能拥有泛型方法与其是否是泛型类没有任何关系,无论何时,只要我们能做到,就应该使用泛型方法,对于一个static方法而言,不能使用泛型类的类型信息,所以要想让一个static使用泛型,就必须让其成为泛型方法

public <T> void f()
{}

使用泛型方法

当我们使用泛型方法时可以不指明泛型信息,编译器会自动帮我们找出具体类型。泛型方法的返回值会被认为是Object类型。如果想要避免这种情况那么就应该在使用发行方法时指明类型信息,要显示的指明类型,必须在点操作符和方法名之间添加尖括号,然后把类型置于括号内,如果在定义该方法的类内使用,必须在操作符之前使用this操作符,如果使用tatic方法,必须在操作符之前添加类名。

泛型与重载

泛型可以作为重载的条件 ,但是当泛型参数遇见Object参数时需要注意,详情请看
java重载时泛型遇见Object类型

泛型与可变参数

他们之间可以完美结合

泛型与数组

1、不能实例化具有参数化类型的数组,但可以创建对这种数组的引用,可以通过强制类型转化创建具有参数化类型的数组
2、可以参数化数组本身

泛型与异常

catch语句不能捕获泛型类型的异常,泛型类也不能直接或间接的继承自Throwable

擦除

在泛型代码内部,无法获取任何有关泛型参数类型的信息,java泛型是使用擦除来实现的,这意味着我们在使用泛型时,任何具体类型信息都被擦除掉了,我们唯一知道的就是我们正在使用一个对象,为解决这一问题也有以下方法。

重载extends

在创建泛型时使用重载extends
< T extends A>
声明T必须具有类型A或是A的导出类,此时擦除就会擦除到类型A,也就相当于用类型A当作占位符
< T extends A&B>
声明T必须同时继承A与B,其中A与B要么同时为接口,要么为一个类和一个接口

通配符

< ? extends A>
具有任何A及从A继承的类型,在使用此通配符时,可以使得泛型具有向上转型的功能,但是我们将丢失任何传递对象的能力,甚至传入Object也不行,编译器也将拒绝任何具有泛型参数的方法的调用。

< ?super A>
具有任何A或基类是A的类型,会使从容器里取东西的get( )方法部分失效,只能存放到Object对象里
< ?>
他和< ? extends Object>相似但是却有不同,使用此通配符实际上是在声明”我是想用Java的泛型来编写这段代码,并不是想用原生类型“

你可能感兴趣的:(java 泛型基础学习)