泛型:标签 :将元素类型设置为参数–>泛型
相当于预先规定了当前集合存储的数据类型,再使用当前集合时,自动规范数据类型。
泛型只能是类,不能是基本数据类型,此类可以是任意类,不一定是包装类,没指定默认为Object
当使用泛型后,重写compateTo 和compare方法时不再需要(Obiect o instanceof 指定类)再强转了
因为集合中的类型已经规定了,不符合的添加不到集合中,所以直接renturn compare()的结果就可
@Test
public void test3(){
ArrayList<Integer> i = new ArrayList<>();
i.add(1);
i.add(5);
Iterator<Integer> iterator = i.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
@Test
public void test4() {
HashMap<String, Integer> map = new HashMap<>();
map.put("杨森", 23);
Set<Map.Entry<String, Integer>> entries = map.entrySet();//泛型嵌套
Iterator<Map.Entry<String, Integer>> iterator = entries.iterator();
while (iterator.hasNext()) {
Map.Entry<String, Integer> next = iterator.next();
String key = next.getKey();
Integer value = next.getValue();
System.out.println(key + "-->" + value);
}
}
@Test
public void test5() {
HashMap<goods, Integer> goodsIntegerHashMap = new HashMap<>();
}
public class fanxing<T> {
private String name;
private int age;
T order;
将T作为一个数据类型使用,可以对order实现get set方法以及构造器中也可使用
在实现这个类的时候可以指明该T的具体类型,但必须是类,必能是基本数据类型
@Test
public void test5() {
fanxing<Integer> fanxing = new fanxing<Integer>();
fanxing.setOrder(133);
System.out.println(fanxing.getOrder());
//fanxing.setOrder("123");//非Integer 无法赋值
System.out.println(fanxing.getOrder());
}
当带泛型的类被继承时,子类不再需要再指定泛型
class testclas extends fanxing<Integer>{
}
testclas testclas = new testclas();
testclas.setOrder(123);
也可不指定,子类同时为泛型类
class testclas1<T> extends fanxing<T>{
}
静态结构不能使用泛型
// T[] arr = new T[10];//T不能直接实例化
T[] arr = (T[]) new Object[10];//通过声明Object再强转
泛型方法:是在调用方法的时候指明泛型的具体类型
public <E> List<E> fun(E[] arr){
ArrayList<E> es = new ArrayList<E>();
System.out.println(es);
return es;
}
例如:
public <E> E fun(E[] arr){
E e = arr[0];
return e;
}
}
@Test
public void test6(){
fanxing<Integer> integerfanxing = new fanxing<>();
Integer[] integers = {1, 2, 3, 4, 5, 6};
Integer fun = integerfanxing.fun(integers);
System.out.println(fun);
}
当调用fun时填入的数据类型会自动确定返回值的数据类型,因此泛型方法可以声明为static
List list1 = null;
List list2 = null;
虽然string是object的子类,但是此时list1与list2为两种毫无关系的对象,
不能将list2赋值给list1 List1 = List2 //报错
但是可以通过通配符,同时与List1、List2建立联系
List> List3 = null;
public void fun(List<?> list){
System.out.println(list);
}
此方法可以传入list1也可传入list2
但是只能读不能写
List extends ##> list1 = null; -----此时G>是G<##>,或G<##的子类>父类
List supper ##> list2 = null; -----此时G>是G<##>,或G<##的父类>父类 //此时G>中可以写入##类及其子类型的数据