- 泛型:可以在类或方法中预支地使用未知的类型。一般在创建对象时,将未知的类型确定具体的类型。当没有指定泛型时,默认类型为Object类型。
- 泛型的使用:定义和使用含有泛型的类格式:修饰符 class 类名<代表泛型的变量> { }
*代表泛型的变量随意,最好是大写字母
public class GClass<E> {
private E name; public E getName() {
return name;
}
public void setName(E name) { this.name = name;
}
public GClass(E name) {
super();
this.name = name;
}
public GClass() {}
@Override
public String toString() {
return "GClass [name=" + name + "]"; }
}
由于泛型变量没有定义,而是在创建对象时给与类中泛型的类型,如下分别给了String和Integer类型。
public class Main {
public static void main(String[] args) {
GClass<String> gc1 = new GClass<>();
gc1.setName("小强");
System.out.println(gc1.getName());
GClass<Integer> gc2 = new GClass<>();
gc2.setName(1234);
System.out.println(gc2.getName());
}
}
运行结果:
小强
1234
- 含有泛型的方法 格式:修饰符<代表泛型的变量> 返回值类型 方法名(参数){ }
- 为更好演示,本次分别定义一个静态方法和一个非静态方法:
public class GMethod {
public<R> void method(R r){
System.out.println(r); } public static<M> void method2(M m) {
System.out.println(m);
}
}
- 基本操作:静态方法直接类名调用,非静态方法利用创建的对象调用。
public class Main {
public static void main(String[] args) {
GMethod gm1 = new GMethod();
gm1.method(32141);
gm1.method("小强");
GMethod.method2("小强");
GMethod.method2(123);
}
}
运行结果:
32141
小强
小强
123
-
含有泛型的接口
格式:修饰符 interface接口名<代表泛型的变量> { }
public interface GInterface<I> { public abstract void method(I i);}
- 定义类时确定泛型的类型,重写接口方法
public class GInterfaceImpl implements GInterface<String> {
@Override
public void method(String i) { System.out.println(i);
}
}
- 创建对象调用method方法
public class Main {
public static void main(String[] args) {
GInterfaceImpl gii =newGInterfaceImpl();
gii.method("aaaab");
}
}
运行结果:
aaaab
- 始终不确定泛型的类型,直到创建对象时,确定泛型的类型,重写接口方法 注意:接口与实现类的泛型要统一
public class GInterfaceImpl2<I> implements GInterface<I>{
@Override
public void method(I i) {
System.out.println(i);
}
}
- 创建对象时确定泛型
public class Main {
public static void main(String[] args) {
GInterfaceImpl2<Integer> gii2 = new GInterfaceImpl2<>();
gii2.method(123421);
GInterfaceImpl2<String> gii3 = new GInterfaceImpl2<>();
gii3.method("小强");
}
}
运行结果:
123421
小强