浅谈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();
    }
}

原文地址:https://www.cnblogs.com/zhuchaoli/p/10331858.html

时间: 2024-10-17 13:30:28

浅谈Java中的泛型的相关文章

【转】浅谈Java中的equals和==

浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String("hello"); 3 4 System.out.println(str1==str2); 5 System.out.println(str1.equals(str2)); 为什么第4行和第5行的输出结果不一样?==和equals方法之间的区别是什么?如果在初

浅谈Java中的对象和引用

浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是"对象和对象引用",很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起了解一下对象和对象引用之间的区别和联系. 1.何谓对象? 在Java中有一句比较流行的话,叫做"万物皆对象",这是Java语言设计之初的理念之一.要理解什么是对象,需要跟类一起结合起来理解.下面这段话引自<Java编程思想>中的一段原话: "按照通

浅谈Java中的equals和==

浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String("hello"); 3 4 System.out.println(str1==str2); 5 System.out.println(str1.equals(str2)); 为什么第4行和第5行的输出结果不一样?==和equals方法之间的区别是什么?如果在初

浅谈Java中的hashcode方法 - 海 子

浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native int hashCode(); 根据这个方法的声明可知,该方法返回一个int类型的数值,并且是本地方法,因此在Object类中并没有给出具体的实现. 为何Object类需要这样一个方法?它有什么作用呢?今天我们就来具体探讨一下hashCode方法. 一.hashCode方法的作用 对于包含容器类型的程

浅谈Java中的对象和对象引用

浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起了解一下对象和对象引用之间的区别和联系. 1.何谓对象? 在Java中有一句比较流行的话,叫做“万物皆对象”,这是Java语言设计之初的理念之一.要理解什么是对象,需要跟类一起结合起来理解.下面这段话引自<Java编程思想>中的一段原话: “按照通俗的说法,每个对象都是某个类(class)的一个实

浅谈Java中的深拷贝和浅拷贝

浅谈Java中的深拷贝和浅拷贝(转载) 原文链接: http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: [java] view plaincopyprint? int apples = 5; int pears = apples; int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short,float

浅谈Java中set.map.List的区别

就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操作数目不固定的一组数据. 所有的JAVA集合都位于 java.util包中! JAVA集合只能存放引用类型的的数据,不能存放基本数据类型. JAVA集合主要分为三种类型: Set(集) List(列表) Map(映射) Collection 接口 :Collection是最基本的集合接口,声明了适用

浅谈JAVA中的“hashcode()”方法

浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native int hashCode(); 为何Object类需要这样一个方法?它有什么作用呢?今天我们就来具体探讨一下hashCode方法. 根据这个方法的声明可知,该方法返回一个int类型的数值,并且是本地方法,因此在Object类中并没有给出具体的实现. 一.hashCode方法的作用 对于包含容器类型的程

浅谈Java中的Set、List、Map的区别(1)

就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操作数目不固定的一组数据. 所有的JAVA集合都位于 java.util包中! JAVA集合只能存放引用类型的的数据,不能存放基本数据类型. JAVA集合主要分为三种类型: Set(集) List(列表) Map(映射) Collection 接口 :Collection是最基本的集合接口,声明了适用