java中的泛型
2019-07-24 17:12
54 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40942323/article/details/97141134
我们都知道集合中是可以存放任意对象的,只要把对象存储集合后,那么这时他们都会被提升成Object类型。当我们在取出每一个对象,并且进行相应的操作,这时必须采用类型转换。
public class GenericDemo { public static void main(String[] args) { Collection coll = new ArrayList(); coll.add("abc"); coll.add("itcast"); coll.add(5);//由于集合没有做任何限定,任何类型都可以给其中存放 Iterator it = coll.iterator(); while(it.hasNext()){ //需要打印每个字符串的长度,就要把迭代出来的对象转成String类型 String str = (String) it.next(); System.out.println(str.length()); } } } 程序在运行时发生了问题java.lang.ClassCastException。由于集合中什么类型的元素都可以存储。导致取出时强转引发运行时 ClassCastException。 Collection虽然可以存储各种对象,但实际上通常Collection只存储同一类型对象。例如都是存储字符串对象。因此在JDK5之后,新增了泛型(Generic)语法,让你在设计API时可以指定类或方法支持泛型,这样我们使用API的时候也变得更为简洁,并得到了编译时期的语法检查。 public class GenericDemo2 { public static void main(String[] args) { Collection<String> list = new ArrayList<String>(); list.add("abc"); list.add("itcast"); // list.add(5);//当集合明确类型后,存放类型不一致就会编译报错 // 集合已经明确具体存放的元素类型,那么在使用迭代器的时候,迭代器也同样会知道具体遍历元素类型 Iterator<String> it = list.iterator(); while(it.hasNext()){ String str = it.next(); //当使用Iterator<String>控制元素类型后,就不需要强转了。获取到的元素直接就是String类型 System.out.println(str.length()); } } }
定义和使用含有泛型的类。在创建对象时确定泛型。
class ArrayList<E>{ public boolean add(E e){ } public E get(int index){ } .... }
含有泛型的方法 。调用方法时,确定泛型的类型
public class MyGenericMethod { public <MVP> void show(MVP mvp) { System.out.println(mvp.getClass()); } public <MVP> MVP show2(MVP mvp) { return mvp; } }
含有泛型的接口。1、定义类时确定泛型的类型 2、始终不确定泛型的类型,直到创建对象时,确定泛型的类型
public interface MyGenericInterface<E>{ public abstract void add(E e); public abstract E getE(); }
泛型通配符
不知道使用什么类型来接收的时候,此时可以使用?,?表示未知通配符。此时只能接受数据,不能往该集合中存储数据
public static void main(String[] args) { Collection<Intger> list1 = new ArrayList<Integer>(); getElement(list1); Collection<String> list2 = new ArrayList<String>(); getElement(list2); } public static void getElement(Collection<?> coll){} //?代表可以接收任意类型
之前设置泛型的时候,实际上是可以任意设置的,只要是类就可以设置。但是在JAVA的泛型中可以指定一个泛型的上限和下限。
public static void main(String[] args) { Collection<Integer> list1 = new ArrayList<Integer>(); Collection<String> list2 = new ArrayList<String>(); Collection<Number> list3 = new ArrayList<Number>(); Collection<Object> list4 = new ArrayList<Object>(); getElement(list1); getElement(list2);//报错 getElement(list3); getElement(list4);//报错 getElement2(list1);//报错 getElement2(list2);//报错 getElement2(list3); getElement2(list4); } // 泛型的上限:此时的泛型?,必须是Number类型或者Number类型的子类 public static void getElement1(Collection<? extends Number> coll){} // 泛型的下限:此时的泛型?,必须是Number类型或者Number类型的父类 public static void getElement2(Collection<? super Number> coll){}
相关文章推荐
- JAVA 泛型
- JAVA 泛型中的<T> 和 <?> 的应用场景
- java再复习——通过反射获取到方法的参数和返回值的泛型类型
- Java 基础一些代码练习笔记( GenericFoo<T> 泛型)
- Java JNI由浅入深(包括:Java和C++互传ArrayList泛型对象参数)
- Java 泛型
- Java JNI由浅入深(包括:Java和C++互传ArrayList泛型对象参数)
- Java语言基础-常用对象API(二)泛型、Map集合
- 深入理解Java之泛型
- Java 泛型学习笔记(一)
- 浅谈java中定义泛型类和定义泛型方法的写法
- Java 泛型详解
- 初学Java,泛型类型通配符(三十七)
- java 泛型
- Java中的泛型
- java 获取泛型的类型
- JAVA-泛型
- 关于《Java 编程思想》第四版第十五章“泛型”逆变例子的疑惑
- java泛型——基本使用
- Java:泛型基础