java7新特性-泛型实例创建的类型推断,泛型实例java源码 .java泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,支持创建可以按类型进行参数化的类。可以把类型参数看成是使用参数化类型时指定的类型的一个占位符,比如方法的形式参数是运行时传递的值的占位符一样。可以在集合框架(Collection framework)中看到泛型的动机。例如,Map 类允许您向一个 Map 添加任意类的对象,即使最常见的情况是在给定映射(map)中保存某个特定类型(比如 String)的对象。

由于Map.get() 被定义成返回 Object,因此一般必须将 Map.get() 的结果强制类型转换为期望的类型,如下面的代码所示:

Map m = new HashMap();
m.put(“key”, “blarg”);
String s = (String) m.get(“key”);

要让程序通过编译,必须将 get() 的结果强制类型转换为 String,并且希望结果真的是一个 String。但是有可能某人已经在该映射中保存了不是 String 的东西,这样的话,上面的代码将会抛出 ClassCastException。

理想情况下,您可能会得出 m 是一个 Map,它将 String 键映射到 String 值。这可以让您消除代码中的强制类型转换,同时获得一个附加的类型检查层,该检查层可以防止有人将错误类型的键或值保存在集合中。这就是泛型所做的工作。

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* author:sustbeckham
* 泛型实例创建的类型推断
**/
public class TypeInference
{
public static void main(String args[]){
// jdk6 之前的泛型写法
Map map1 = new HashMap();
// jdk7 现在可以这么写法,HashMap可以推断出泛型类型
Map map2 = new HashMap<>();
// 但是类型推测也是有限制的
// 这里当然能推断出来
List list = new ArrayList<>();
// 这个当然也对
list.add(“beckham”);
// ————这个就不对了,也很好理解,你直接冒出来一个这<>,谁知道你是什么啊—————
// 当然看错误你就会发现 这里实际是要放入一个new ArrayList()
// 所以有2种改造方法
// 1. 前面的定义改为List list = new ArrayList<>();
// 2. List extends String> list2 = new ArrayList<>();
// list.addAll(list2);
// list.addAll(new ArrayList<>());
List extends String> list2 = new ArrayList<>();
list.addAll(list2);
// 下边是关于类的类型推测。挺拗口的
new MyClass(“Liverpool”);
// 泛型类也是可以推测的,和以上的方法类似。比如原始的方式应该是…
MyClass m1 = new MyClass(“m1″);
// 现在可以写成…
MyClass m2 = new MyClass<>(“m2″);
// 甚至于! (不过这种方式暂时在测试时候没有通过,是不是7以后的update版本会有呢?)
// MyClass m3 = new MyClass<>(“m3″);
}
}
/**
* 一个简单的泛型类
**/
class MyClass
{
// 只是构造器而已
 MyClass(T t){
System.out.println(t);
}
}