JDK5中引入的特性
这种参数类型可以用在类、方法和接口中,分别被称为泛型类、泛型方法、泛型接口
泛型的好处:
把运行时期的问题提前到了编译期间
避免了强制类型转换
运用灵活,方便
泛型类
public class Generic<T> {
private T t;
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
}
public static void main(String[] args) {
Generic<String> g = new Generic<>();
g.setT("abc");
System.out.println(g.getT());
//不用再事先建立两个类
//只需要在创建对象的时候传入数据类型就可以
//不过每次都需要创建不同对象
Generic<Student> g2 = new Generic<>();
g2.setT(new Student("xiaoxiao",3));
System.out.println(g2.getT());
}
泛型方法
每次调用方法想传入不同数据类型进方法,都需要创建对象来规定数据类型,很麻烦
为此有了泛型 方法,直接调用方法即可。
重要的就是 public <T> void show(T t)
//泛型方法改进
public class Generic{
public <T> void show(T t) {
System.out.println(t);
}
}
public static void main(String[] args) {
Generic g = new Generic();
g.show("林青霞");
g.show(30);
g.show(true);
g.show(12.34);
}
泛型接口
与泛型类类似,接口也是一种类
//泛型接口
public interface Generic<T>{
void show(T t) ;
}
public class GenericImpl<T> implements Generic<T> {
@Override
public void show(T t) {
System.out.println(t);
}
}
public static void main(String[] args) {
GenericImpl<String> g = new GenericImpl<>();
g.show("dfsd");
System.out.println("=====================");
GenericImpl<Byte> g2 = new GenericImpl<>();
g2.show(Byte.parseByte("3"));
}
类型通配符
List<?> list1 = new ArrayList<>();
List<?> list2=new ArrayList<Number>();
List<?> list3=new ArrayList<Student>();
System.out.println("======================");
//上限
List<? extends Number> list5 =new ArrayList<Number>();
List<? extends Number> list6 =new ArrayList<Integer>();
//下限
System.out.println("============================");
List<? super Number> list7 =new ArrayList<Number>();
List<? super Number> list8 =new ArrayList<Object>();