Java泛型(1)--使用泛型

2017-12-04  本文已影响0人  Kylin824

泛型:解决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));
    }
}

通配符的上限可设定

泛型提供了被限制的泛型通配符

上一篇 下一篇

猜你喜欢

热点阅读