泛型在接口中使用的格式【重点】
接口
泛型在接口种使用的格式
Interface 接口名<自定义泛型无意义英文单个字母大写占位符> {
自定义泛型有且只能成员方法使用;
}
【接口中的成员变量不能使用自定义泛型】
如何使用带有泛型的接口?
//带有自定义泛型的接口
interface MyTest<T> {
//成员方法
//缺省属性为 public abstract
<T>T test1(T t);
//接口名后面有<T> 所以方法返回值位置可以没有<T>
//如果接口名后面没有<T>,方法返回值位置一定要有<T>
T test2(T t);
}
//自由方式
//实现带有自定义泛型的接口
//可以实现的时候使用泛型<T>,但是要在创建对象的时候把具体的类型确认
class Member<T> implements MyTest<T>{
//实现类使用和接口相同的泛型
//泛型对应具体数据类型在创建当前类对象时明确;
@Override
public <T> T test1(T t1) {
return t1;
}
@Override
public T test2(T t) {
System.out.println("未明确泛型具体数据类型操作方式,自由!");
return t;
}
}
//乖巧模式
//实现类在遵从带有自定义泛型的接口时,接口中泛型的具体数据类型已经确认
//实现类完成的对应方法就OK
//实现类的时候MyTest<> 后面的泛型里面赋值String
//所以在实现方法的时候 test2() 受到影响,参数类型直接变成String
//但是test1() 方法不受影响,因为他的返回值位置上有<T>,所以独立,不受类名和接口名后面的<T>影响
class Compan implements MyTest<String>{
//不受影响,因为返回值位置有<T>,所以不受上一级类和接口的影响;独立的
@Override
public <T> T test1(T t1) {
return t1;
}
@Override
public String test2(String s) {
return s;
}
public static void main(String[] args) {
//自由模式,创建实现类对象的时候,直接给自由模式泛型类型进行赋值
Member<Integer> member = new Member<>();
//方法返回值位置自己有<T>,不受上一级影响
//不受类或接口的泛型影响,可以任意类型;
String name = member.test1("小哈");
//方法返回值位置没有自己的<T>,就要收到上一级影响,就要符合整个接口或者类的整个泛型
//因为创建对象的时候赋值Integer类型,所以这里只能是Integer类型;
Integer age = member.test2(10);
}
}