Java 泛型在实际开发中的应用

一:泛型出现的背景

二: 泛型的语法使用

1:使用具体的泛型类型: 尖括号内带有具体的类型。可以限定这个Map的key和value只能是字符串

 2:方法声明的时候 : public   T getValue(){...}

3 :类或者接口使用泛型  interface Collection {..}

4:  声明带边界的泛型   class userDao

5:用于通配符  

三: 泛型可以用到那些地方

四: Java中泛型独特之处

Java会在编辑期把泛型擦除掉

擦除的原理以及边界

泛型擦除肯可能导致的问题

五: 泛型中特殊使用

程序如果运行时需要类型信息

异常中使用泛型

数组与泛型

泛型的一些其他细节:  

六:简单概括

正文

  Java泛型是对Java语言的类型系统的一种扩展,泛型的本质就是将所操作的数据类型参数化。下面我会由浅入深地介绍Java的泛型。

一:泛型出现的背景

在java代码里,你会经常发现类似下边的代码:

public class Test { public static void main(String[] args) { List list = new ArrayList(); list.add("hah"); //list.add(new Test()); // list.add(1); for (Object object : list) { String s1 = (String)object; //.....如果是你你该如何拿出list的值,如果list中放着上边的不同类型的东西。无解 } } }

  编码的时候,不加泛型是可以的,但是 你从容器中拿出来的时候必须强制类型转换,第一是多敲很多代码,第二极容易发生类型转换错误,这个运行时异常 比如你把上边

注释的代码放开,程序在获取容器的地方就会报运行时异常 ClassCasrException

Java语言的设计者引入了泛型,暂时先不追究它内在是怎么实现的。只需要知道,如果我们像下边这么写,我们就不需要强制类型转换。我们也不需要担心运行是异常了。

List<String> newList = new ArrayList<String>(); newList.add("hhe"); newList.add("123"); String s1 = newList.get(0);//不需要强制类型转换,因为我加了泛型,我就认为它里边一定都是String

二: 泛型的语法使用 1:使用具体的泛型类型: 尖括号内带有具体的类型。可以限定这个Map的key和value只能是字符串

Map<String, String> map = new HashMap<String, String>(); map.put("key","value"); String value = map.get("key")

从面向对象的角度看,使用对象的时候,泛型内传入的具体的类型。声明的时候采用尖括号内加占位符的形式,比如这是HashMap的源码

public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable{ ... public HashMap(Map<? extends K, ? extends V> m) { this(Math.max((int) (m.size() / DEFAULT_LOAD_FACTOR) + 1, DEFAULT_INITIAL_CAPACITY), DEFAULT_LOAD_FACTOR); putAllForCreate(m); } ... public V remove(Object key) { Entry<K,V> e = removeEntryForKey(key); return (e == null ? null : e.value); } }

 2:方法声明的时候 : public  <T> T getValue(){...}

  在上边的代码中,我们可以看到在类上如何定义泛型,也看到了类上定义的占位符在类的普通方法上可以直接使用。但是如果想在静态方法上定义泛型,这需要单独的处理  。下面我们单独对方法上如何定义

和使用泛型进行介绍(注意:方法上是否定义泛型和类上是否定义没有必然的联系)

比如Web项目中,泛型是修饰类型的,在方法上,一般就是返回值和参数列表

  返回值类型:可以定义为List<String>等形式,但是实际开发中,一般都是不知道具体类型,定义形式如下  <T> List<T> test(T t){...} ,前边的<T>可以理解为泛型的声明,你只有声明了T,你才可以在              方法中用到T,这一具体的类型, List<T>是具体的返回值类型。

  方法传参: 可以用占位符限定的容器 比如 List<T>,或者直接是占位符 T  

public class BaseServiceImpl implements BaseService { protected <T> List<T> calcPage(String hql, PageContext pageContext, Object... params) { int total = getDataTotalNum(hql, params); pageContext.setTotal(total); List<T> list = (List<T>) getPageDataByHQL(hql, pageContext.getRows(), pageContext.getPage(), pageContext.getTotal(), params); return list; } @Override @Sync public void deleteBatchVO(final List<?> dataList) throws ServiceException { baseDAO.deleteBatchVO(dataList); } @Override public List<?> getPageDataByHQL(final String hql, final Map<String, Object> filter) throws ServiceException { return baseDAO.getPageDataByHQL(hql, filter); } }

简单的例子:

public <T> T TestG(T t){ return t; }

方法定义的时候,泛型是这样设计,在使用的时候,代码如下:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/be959c8316866dd81eeaa284fd882a77.html