泛型在接口中使用的格式【重点】
接口
成员变量:缺省属性:public static final (所有变量都是静态不可继承变量)
成员方法: 缺省属性:public abstract (所有成员方法都是抽象方法)
泛型在接口种使用的格式
Interface 接口名<自定义泛型无意义英文单个字母大写占位符> {
自定义泛型有且只能成员方法使用;
}
【接口中的成员变量不能使用自定义泛型】
1.成员变量的缺省属性是public static final 定义时必须初始化,但是泛型初始化为什么没有具体的数据类型,无法进行初始化操作;
2.成员变量static修饰,当前成员变量需要在加载阶段,明确所有内容【也就是静态成员变量必须初始化,但是泛型又偏偏不让你初始化】,但是当前情况下,数据类型不明确的;有悖于语法;所以成员变量不受接口泛型限制的原因还是因为静态;
如何使用带有泛型的接口?
接口没有自己的类对象
<1>接口不是类;
<2>接口中存在未完成的方法,就算是有对象,也得报错;
带有泛型的接口是哦那个需要以来于实现类完成,这里有两种方式;
<1>自由模式;
<2>乖巧模式;
//带有自定义泛型的接口
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);
}
}