泛型接口
泛型接口和泛型类的声明方式一致。泛型接口的具体类型需要在实现类中进行声明。
语法结构
public interface 接口名<泛型表示符号> {
}
示例:(接口)
public interface Igeneric <T>{
T getName(T name);
}
示例:(接口实现类)
public class IgenericImp1 implements Igeneric<String>{
@Override
public String getName(String name) {
return name;
}
}
示例:(测试类)
public class Test1 {
public static void main(String[] args) {
IgenericImp1 igeneric = new IgenericImp1();
String name = igeneric.getName("gugugu");
System.out.println(name);
Igeneric<String> igeneric1 = new IgenericImp1();
String name1 = igeneric1.getName("maomaotou");
System.out.println(name1);
}
}
泛型方法
泛型类中所定义的泛型,在方法中也可以使用。但是,我们经常需要仅仅在某一个方法上使用泛型,这时候可以使用泛型方法。
泛型方法是指将方法的参数类型定义成泛型,以便在调用时接收不同类型的参数。 类型参数可以有多个,用逗号隔开,例:<K,V>。定义时,类型参数一般放到返回值前面。
调用泛型方法时,不需要像泛型类那样告诉编译器是什么类型,编译器可以自动推断出类型来。
非静态方法
语法结构
public <泛型表示符号> void getName(泛型表示符号 name) {
}
public <泛型表示符号> 泛型表示符号 getName(泛型表示符 name) {
}
定义泛型方法后,方法中无论是返回值类型还是方法参数都能使用泛型来作为类型。
示例:
public class MethodGeneric {
public <T> void setName(T name) {
System.out.println(name);
}
public <T> T getName(T name) {
return name;
}
}
public class Test2 {
public static void main(String[] args) {
MethodGeneric methodGeneric = new MethodGeneric();
methodGeneric.setName("maomao");
methodGeneric.setName(123);
MethodGeneric methodGeneric2 = new MethodGeneric();
String name = methodGeneric2.getName("gugugu");
Integer name1 = methodGeneric2.getName(111);
System.out.println(name);
System.out.println(name1);
}
}
静态方法
静态方法中使用泛型时有一种情况需要注意,那就是静态方法无法访问类上定义的泛型。如果静态方法操作的引用数据类型不确定的时候,必须要将泛型定义在方法上。
语法结构
public static <泛型表示符号> void getName(泛型表示符号 name) {
}
public static <泛型表示符号> 泛型表示符号 getName(泛型表示符号 name) {
}
示例:
public class MethodGeneric {
public static <T> void setFlag(T flag) {
System.out.println(flag);
}
public static <T> T getFlag(T flag) {
return flag;
}
}
public class Test3 {
public static void main(String[] args) {
MethodGeneric.setFlag("gugugu");
MethodGeneric.setFlag(333);
String flag = MethodGeneric.getFlag("maomao");
System.out.println(flag);
Integer flag1 = MethodGeneric.getFlag(234);
System.out.println(flag1);
}
}