一、泛型接口:泛型在接口上声明
在接口上必须定义其相应子类:
形式一:在子类继续设置泛型
//设置泛型接口,泛型可以设置多个,例,IMessage<E,T>,使用逗号分隔即可
interface IMessage<E> {
public void print(E t);
}
//子类也继续使用泛型,并且与父接口使用和子类同样的泛型标记
class MessageImp<E> implements IMessage<E>{
@Override
public void print(E t) {
// TODO Auto-generated method stub
}
}
形式二、在子类不设置泛型,而为父接口明确定义一个泛型类型,建议使用这种方法
interface IMessage<E> {
public void print(E t);
}
//父类明确设置泛型类型
class MessageImp implements IMessage<String>{
@Override
public void print(String t) {
System.out.println(t);
}
}
public class Main {
public static void main(String[] args) {
//此时创建对象的时候,不再需要设置泛型,子类已经明确了类型为String
MessageImp mes = new MessageImp();
mes.print("11");
}
}
二、泛型方法:泛型方法不一定非要定义在支持泛型的类里面
public class Main {
public static void main(String[] args) {
String str = fun("hello");
System.out.println(str);
}
//T的类型由传入的参数决定
public static <T>T fun(T t) {
return t;
}
}
总结:
1、泛型解决的是向下转型所带来的安全隐患,其核心的组成就是在声明类或者接口的时候不设置参数或属性的类型
2、“?”可以接收任意的泛型类型,只能够取出,但是不能修改