泛型:解决Java集合无法记住元素数据类型,取出元素需要强制转换的缺点
使用泛型:
List<String> strLists = new ArrayList<String>();
Map<String, List<String>> m = new HashMap<String, List<String>>();
Java7之后可以省略构造器后的泛型信息 --“菱形语法”
List<String> strLists = new ArrayList<>();
Map<String, List<String>> m = new HashMap<>();
可以为任何类、接口增加泛型声明
Java中为List接口添加的泛型声明
public interface List<E>
{
//E作为类型时使用
void add(E x);
Iterator<E> iterator();//调用此iterator()方法返回Iterator<E>类型
...
}
public interface Iterator<E>
{
E next();//返回E类型的元素
Boolean hasNext();
...
}
public interface Map<K, V>
{
//K,V作为类型使用
Set<K> keySet();//调用此keySet()方法返回Set<K>类型
V put(K key, V value)
...
}
为自定义类添加泛型声明
public class Apple<T> {
private T info;//泛型类型静态变量
private int test;//普通类型静态变量
public Apple(T info) {//构造器名与原来相同 而不是Apple<T> 但调用构造器要用Apple<T>,T可省略
this.info = info;
}
public T getInfo() { //泛型构造器、set与get方法,以传入的T为类型
return info;
}
public void setInfo(T info) {
this.info = info;
}
public Apple(int p){
this.test = p;
}
public int getTest() { //普通构造器、set与get方法
return test;
}
public void setTest(int test) {
this.test = test;
}
public static void main(String[] Args){
//以泛型为参数
Apple<String> a1 = new Apple<>("apple");
System.out.println(a1.getInfo());
//普通形式
Apple a2 = new Apple(123);
System.out.println(a2.getTest());
}
}
从泛型类派生子类 -- 创建子类继承上面的Apple泛型类
public class A extends Apple<T> //错误,父类不能再包含类型型参
public class A extends Apple<String> //正确
public class A extends Apple //正确 不传入实际的类型参数,编译器会发出警告,但可通过编译
不存在泛型类
List<String> l1 = new ArrayList<>();
List<Integer> l2 = new ArrayList<>();//不管类型参数时什么,都被当作同一个类处理
System.out.println(l1.getClass()==l2.getClass());//结果为true
String是Object的子类,String可当作Object对象处理
List<String>不是List<Object>的子类,List<String>不能当作List<Object>对象处理
方法传入集合做形参,因为集合的元素类型不确定,因此用类型通配符<?>,将元素全部认为时Object类型
public static void test(List<?> c){
for (int i=0; i<c.size();i++)
{
System.out.println(c.get(i));
}
}
通配符的上限可设定
泛型提供了被限制的泛型通配符
网友评论