泛型:可以近似理解为C语言中的宏定义对
0.定义一个泛型类
ps: 对于包装类型变量,是可以直接获得变量名的
eg: a.getClass().getTypeName();
//此处标识符T 可以随意写
public class Generic<T> { //泛型类的<>定义在名称后面
private T s;
public void a(T a) { //作为参数
System.out.print(a + " ");
System.out.println(a.getClass().getTypeName());
}
public <T> void aa(T a) { //泛型方法的<>定义在返回值类型前面
System.out.print(a + " ");
System.out.println(a.getClass().getTypeName());
}
public static <T> void aaa(T a) {
System.out.print(a + " ");
System.out.println(a.getClass().getTypeName());
}
}
1.泛型类的使用
(0)直接使用
public class Main {
public static void main(String[] args) {
Generic<String> a = new Generic<>();
Generic<Integer> b = new Generic<>();
//方法a的泛型与new的泛型类一致
a.a("a");
b.a(1);
//方法aa的泛型与传入的参数相关
a.aa(2);
b.aa("b");
Generic.aaa("static");
}
}
运行结果
(1)继承使用
public class Main {
public static void main(String[] args) {
// Number 是 ?(未知类型) 的父类
Generic<? super Number> generic = new Generic<>();
generic.a(1.2);
generic.a(1);
generic.a(2.6f);
}
}
运行结果
(2)类的泛型定义
ps: 找类名的方法 a.getClass()
public class Main {
public static void main(String[] args) {
Class<? extends AA> aClass1 = AA.class; //常用1
System.out.println(aClass1);
try {
Class<?> aClass2 = Class.forName("com.company.Main$AA"); //"完整类名"
System.out.println(aClass2);
} catch (ClassNotFoundException e) {
System.out.println("类名未找到");
}
AA aClass3 = new AA(); //常用2
System.out.println(aClass3.getClass());
}
private static class AA extends CC{
@Override
public String toString() {
return "AA";
}
}
private static class BB extends AA{
@Override
public String toString() {
return "BB";
}
}
private static class CC implements DD {
@Override
public String toString() {
return "AA";
}
}
private interface DD{} //接口
}
运行结果