https://blog.csdn.net/s10461/article/details/53941091
1、泛型类
public class Demo {
public static void main(String[] args) throws CloneNotSupportedException {
ObjectTool<String> tool=new ObjectTool();
tool.show("123");
}
}
class ObjectTool<T>{
public void show(T t) {
System.out.println(t);
}
}
2、泛型方法
public class Demo {
public static void main(String[] args) throws CloneNotSupportedException {
ObjectTool tool=new ObjectTool();
tool.show("123");
}
}
class ObjectTool{
public <T>void show(T t) {
System.out.println(t);
}
}
3、泛型接口
public class Demo {
public static void main(String[] args) throws CloneNotSupportedException {
new ObjectToolImpl<String>().show("123");
}
}
interface ObjectTool<T>{
public <T>void show(T t);
}
class ObjectToolImpl<T> implements ObjectTool<T>{
@Override
public <T> void show(T t) {
System.out.println(t);
}
}
4、泛型通配符
泛型通配符的作用在我看来有点像,正则表达式,用来限制右边存入的对象。
image.png
可以看到编译期间,一旦在左边限定死了类型,那么右边也必须传该类型,无论是Object还是子类,都会报错。
而泛型通配符就是来解决这个问题的,可以使限定的类型更加的灵活。
1、任意类型<?>
public class Demo {
public static void main(String[] args){
Collection<?> list1 = new ArrayList<Animal>();
Collection<?> list2 = new ArrayList<Object>();
Collection<?> list3 = new ArrayList<Dog>();
Collection<?> list4 = new ArrayList<Cat>();
}
}
2、向上限定,e及其子类。Collection<? extends E>
image.png
3、向下限定,e及其父类。
需要注意的是,通配符只是限定右边的类型,右边还是要确定类型的。真正add的时候也必须传右边的类型(右边类型就有多态了)。
网友评论