1、泛型的定义:泛型指的就是在类定义的时候并不会设置类中的属性或方法中的参数的具体类型,而是在类使用时再进行定义。
2、泛型的基本语法:
class MyClass<T>{
T value1;
}
3、尖括号 <> 中的 T 被称作是类型参数,用于指代任何类型。实际上这个T你可以任意写,但出于规范的目的,Java 还是建议我们用单个大写字母来代表类型参数。常见的如:
- T 代表一般的任何类。
- E 代表 Element 的意思,或者 Exception 异常的意思。
- K 代表 Key 的意思 V 代表 Value 的意思,通常与 K 一起配合使用。
- S 代表 Subtype 的意思。
4、泛型只能接受类,所有的基本数据类型必须使用包装类
5、泛型类可以接收多个类型参数
(泛型类引入多个类型参数以及使用:)
class Myclass<T t>{
T value1;
E value2;
}
Public class Test{
Public static void main(String[] arg){
MyClass<String,Integer>myClass1 = new MyClass<String,Integer>();
}
}
6、泛型的出现彻底改变了向下转型的需求
7、泛型不仅可以用于定义类,还可以单独来定义方法。
<1>泛型方法定义
class MyClass{
public <T> void testMethod(T t) {
System.out.println(t);
}
}
<2>声明的类型参数,其实也是可以当作返回值的类型的
(使用类型参数做返回值的泛型方法:如下)
class MyClass{
public <T> T testMethod(T t) {
return t;
}
}
<3>泛型方法与泛型类可以共存
(泛型方法与泛型类共存:如下)
class MyClass<T>{
public void testMethod1(T t) {
System.out.println(t);
}
public <T> T testMethod2(T t) {
return t;
}
}
public class Test {
public static void main(String[] args) {
MyClass<String> myClass = new MyClass<>();
myClass.testMethod1("hello 泛型类");
Integer i = myClass.testMethod2(100);
System.out.println(i);
}
}
MyClass <T> 是泛型类,testMethod1 是泛型类中的普通方法,而 testMethod2 是一个泛型方法。 而泛型类中的类型参数与泛型方法中的类型参数是没有相应的联系的,泛型方法始终以自己定义的类型参数为准。泛型类的实际类型参数是 String,而传递给泛型方法的类型参数是 Integer,两者不相干。但是,为了避免混淆,如果在一个泛型类中存在泛型方法,那么两者的类型参数好不要同名。
8、在"?"的基础上又产生了两个子通配符:
- ? extends 类:设置泛型上限: 例如:? extends Number,表示只能够设置Number或其子类,例如:Integer、Double等;
- ? super 类:设置泛型下限:例如:? super String,表示只能够设置String及其父类Object。
7、泛型接口的定义:泛型除了可以定义在类中,也可以定义在接口里面,这种情况我们称之为泛型接口。
范例:
interface IMessage<T> {
// 在接口上定义了泛型
public void print(T t) ;
}
8、在泛型类被类型擦除的时候,之前泛型类中的类型参数部分如果没有指定上限,如 <T> 则会被转译成普通的 Object 类型,如果指定了上限如 <T extends String> 则类型参数就被替换成类型上限。