泛型类
1.定义:在类定义的时候并不会设置类中的属性或方法中的参数的具体类型,而是在类使用时再进行定义。
2.泛型的基本使用语法:
class MyClass<T> {
T value1;
}
尖括号 <> 中的 T 被称作是类型参数,用于指代任何类型。实际上这个T你可以任
意写,但出于规范的目的,Java还是建议我们用单个大写字母来代表类型参数。常 见的如:
T 代表一般的任何类。
E 代表 Element 的意思,或者 Exception 异常的意思。
K 代表 Key 的意思
V 代表 Value 的意思,通常与 K 一起配合使用。
S 代表 Subtype 的意思,文章后面部分会讲解示意
3.泛型类的实例化:
1.变量类型中指定类型参数的具体类型
2.构造方法中可以省略类型参数的具体类型 <>—不可以省略
MyClass<String> myClass1 = new MyClass<String>();
MyClass<Integer> myClass2 = new MyClass<Integer>();
注释:泛型只能接受类,所有泛型的具体化的基本数据类型必须使用包装类!
泛型方法
:和泛型类没有直接关系----主要用于参数的传递
1.泛型方法的定义:泛型方法的类型参数是在方法返回值的前面定义<T,…>
public <T> void testMethod(T t) {
System.out.println(t);
}
注释:
a. 中的 T 被称为类型参数,而方法中的 T 被称为参数化类型,它不是运行 时真正的参数。
b. 调用泛型方法的时候直接传参数就行,不用规定泛型的类型。
2.泛型也可以当做返回值来使用:–要求参数和返回值类型相同时
public <T> T testMath(T t){
return t;
}
泛型类可以和泛型方法并存
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 是泛型类,testMethod1 是泛型类中的普通方法,而 testMethod2 是一个泛型方法。
而泛型类中的类型参数与泛型方法中的类型参数是没有相应的联系的,泛型方法始终以自己定义的类型参数为准。
泛型类的实际类型参数是 String,而传递给泛型方法的类型参数是 Integer,两者不相干。但是,为了避免混淆,如果在一个泛型类中存在泛型方法,那么两者的类型参数最好不要同名。比如,
MyClass 代码可以更改为这样:
class MyClass<T>{
public void testMethod1(T t) {
System.out.println(t);
}
public <E> E testMethod2(E e) {
return e; }
}