java泛型小结
2016-01-11 10:21
447 查看
我自己写了一个Map类,用来模拟真正的工作Map,来分析java的泛型工作机制。类代码如下:
一共三个方法:get 、put、saySomething。
其中get方法模拟Map中的get方法,put方法模拟Map中的put方法。doSomething是一个静态的泛型方法。因为静态泛型比较特殊,因此我单独写了saySomething 方法来测试。
测试类代码如下:
执行结果如下:
总结:
1:泛型方法其实作用是在编译期,在编译期的时候,泛型方法可以通过类型检查,发现我们往容器中放入了错误的类型。防止运行时出现转型异常。
2:java泛型可以给我们提供隐式的类型转换功能,不需要手动进行类型转换。
3:自我猜测-java泛型方法,比如上面的get方法,传入参数和返回值都是泛型类型参数。我想在运行时,这些参数都是Object类型的,但是泛型机提供了一种类型转换机制,所以我们在使用的时候,内部都是会经过一次类型转换。因此该方法才可以动态地接受不同类型的参数,并且可以正常返回值。
注意:如果定义类的时候,如果没有显示的设置泛型类型,应该默认都为Object类型
如果定义类的时候,显示设置泛型类型,那么内部应该会有隐式的类型转换过程。
4:静态方法泛型是独立于当前类的,所以需要预先定义泛型参数,如:
public class SimpleMap<K, V> { private Object ks[] = new Object[10]; private Object vs[] = new Object[10]; @SuppressWarnings("unchecked") public V get(K k) { V res = null; for(int i = 0; i < ks.length; i++){ if(k.equals(ks[i])){ res = (V)vs[i]; } } return res; } public void put(K k, V v) { for(int i = 0 ; i < ks.length;i++){ if(null == ks[i]){ ks[i] = k; vs[i] = v; break; } } } public static <V,K> V saySomething(K k, V v){ System.out.println(k); System.out.println(v); return v; }
一共三个方法:get 、put、saySomething。
其中get方法模拟Map中的get方法,put方法模拟Map中的put方法。doSomething是一个静态的泛型方法。因为静态泛型比较特殊,因此我单独写了saySomething 方法来测试。
测试类代码如下:
public class MainTest { public static void main(String[] args) { testSimpleMap(); } @SuppressWarnings("unchecked") public static void testSimpleMap(){ @SuppressWarnings("rawtypes") SimpleMap sm = new SimpleMap(); sm.put("hello",new Date()); sm.put("second", "world"); System.out.println("hello"+" "+ sm.get("hello").getClass()); System.out.println("second"+" "+ sm.get("second").getClass()); Date date1 = SimpleMap.saySomething("hello", new Date()); System.out.println(date1); } }
执行结果如下:
hello class java.util.Date second class java.lang.String hello Mon Jan 11 10:11:39 CST 2016 Mon Jan 11 10:11:39 CST 2016
总结:
1:泛型方法其实作用是在编译期,在编译期的时候,泛型方法可以通过类型检查,发现我们往容器中放入了错误的类型。防止运行时出现转型异常。
2:java泛型可以给我们提供隐式的类型转换功能,不需要手动进行类型转换。
3:自我猜测-java泛型方法,比如上面的get方法,传入参数和返回值都是泛型类型参数。我想在运行时,这些参数都是Object类型的,但是泛型机提供了一种类型转换机制,所以我们在使用的时候,内部都是会经过一次类型转换。因此该方法才可以动态地接受不同类型的参数,并且可以正常返回值。
注意:如果定义类的时候,如果没有显示的设置泛型类型,应该默认都为Object类型
如果定义类的时候,显示设置泛型类型,那么内部应该会有隐式的类型转换过程。
4:静态方法泛型是独立于当前类的,所以需要预先定义泛型参数,如:
相关文章推荐
- Spring MVC之@RequestBody, @ResponseBody @PathVariable @SessionAttributes @ModelAttribute详解
- java 基本数据类型
- 简单spring mvc项目搭建
- java i++ ++i 小例子
- Java 设计模式---策略模式
- Struts2返回JSON对象的方法总结
- java线程的创建
- spring 各个历史版本的源码及jar包下载地址
- java开发时,eclipse设置编码
- eclipse创建Maven父子结构Maven项目
- Spring Data JPA 全局DAO的扩展
- JAVA IO 详解
- 韩顺平java sql server语句的使用
- java注解(annotation)的执行顺序
- SpringMVC+Spring4+Mybatis3集成,开发简单Web项目
- java 反射调用
- Eclipse中使用Maven,报错“$MAVEN_HOME”
- Java集合:线性表: JAVA_stack
- 单例模式的几种实现方式
- gson java对象与json转换