泛型是指一个类或方法被设计得可以适应多种不同的情况,例如, 运行时才能知道的类型。
泛型在类型安全实在编译期得以保证的, 在运行时泛型依然是使用Object对象实现的, 但是编译器帮我们进行类型安全的保证和自动的类型转换。
泛型类:
class GenericClass<T1, T2> { public GenericClass(T1 t1, T2, t2) { System.out.println("t1的类型: " + t1.getClass().getName() + "\n" + "t2 的类型:" + t2.getClass().getName()); } } |
泛型方法:
public <T1, T2> T1 genericMethod(T1 t11, T1, t22, T2 t2) { System.out.println("t11 的类型:" + t11.getClass().getName()); System.out.println("t11 的类型:" + t11.getClass().getName()); System.out.println("t11 的类型:" + t11.getClass().getName()); } |
注意, 在泛型中用同一个类型参数表示的类型不一定要是相同的, 但是如果要使用一个变量记录方法的返回值, 则编译器会将使用相同类型参数的变量转换成相同的类型(如都转换为他们的父类)再代入方法。
如:
public class Test { public static void main(String[] args) { System.out.println(new Test().genericMethod(new c1(), new c2()).getClass().getName()); // c1 c = new Test().genericMethod(new c1(), new c2()); 错误: Type mismatch: cannot convert from c0 to c1 c0 c = new Test().genericMethod(new c1(), new c2()); } public <T> T genericMethod(T instan, T other) { System.out.println(instan.getClass().getName()); System.out.println(other.getClass().getName()); return instan; } } class c0 { } class c1 extends c0 { } class c2 extends c0 { } |
同时, 泛型还可以对类型参数代表的类型进行限定, 进行限定后可以使用传入的参数中的字段和方法
public <T extends String & Number & MyClass> T genericMethod(T myclass) { System.out.println(myclass.value); } class MyClass { int value = 10; } |
此时T所代表的类型只能是 String, Number, MyClass, 或他们的子类