浅谈Java中的泛型

泛型是Java自JDK5开始支持的新特性,主要用来保证类型安全。另外泛型也让代码含义更加明确清晰,增加了代码的可读性。

  • 泛型的声明和使用

  在类声明时在类名后面声明泛型,比如MyList<T>,其中T就是泛型,相当于一个类型变量,表示MyList类期望操作的类型。

public class MyList<T> {
    public void add(T t) {
    }
}

  当定义MyList变量、创建MyList对象、声明MyList子类时就可以为泛型T指定具体类型

public static void main(String[] args) {
    MyList<String> myList = new MyList<String>();
    myList.add("只能传入字符串");
}

  其实泛型在Java集合框架中使用的非常广泛,集合类的绝大部分操作都使用了泛型,由于泛型是JDK5时出现的,为了兼容旧版本,以下写法也能编译通过,至于是否有泛型效果则取决于变量是否有泛型

List<Integer> list = new ArrayList<Integer>(); //标准写法
List<Integer> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList();
List list3 = new ArrayList<Integer>(); //无泛型效果
List list4 = new ArrayList(); //无泛型效果
  • 泛型察除

  Java语言对泛型的实现有些蹩脚,虽然泛型变量的名称和子类继承父类时为泛型指定的具体类型可以通过反射拿到,但声明变量和创建对象时的泛型信息却被擦除了。

  获得泛型变量的名称:T

public class MyList<T> {
    public void getType() {
        TypeVariable[] type = MyList.class.getTypeParameters();
        System.out.println(type[0]);//T
    }
}

  获得子类继承父类时为泛型指定的具体类型(这点对编写通用类特别重要):

public class MyList<T> {
    public void getType() {
        ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass();
        Class tClass = (Class) type.getActualTypeArguments()[0];
        System.out.println(tClass);//class java.lang.String
    }
}
public class MyChild extends MyList<String> {
    public static void main(String[] args) {
        MyChild child = new MyChild();
        child.getType();
    }
}

猜你喜欢

转载自www.cnblogs.com/zhuchaoli/p/10331858.html