泛型:规定类型的一种方式 <类型>
为什么需要泛型?
List list = new ArrayList();
list.add("aaa");
list.add(100);
for (int i = 0; i < list.size(); i++) {
String name = (String) list.get(i); //取出Integer时,运行时出现异常
list可以放任何类型,但是取出时候很可能出现问题。
泛型好处:
1.类型安全。编译期间检查类型,而不是运行期。将类型检查从运行期到编译期间容易找到错误,提高程序可靠性;
2.消除类型强制转化
使用情况
一般和集合使用,提前规定集合类型,在存入和取出保证同一类型。
注意:泛型类型并不会影响对象实例,如:
List<String> stringList = new ArrayList<String>();
List<Integer> integerList = new ArrayList<Integer>();
System.out.println(stringList.getClass() == integerList.getClass());
输出:true
尽量使用精确地类型定义,一般在项目中<实体类>,表明该集合元素类型是实体类型。
例: List<String> stringList = new ArrayList<String>();
List<Integer> integerList = new ArrayList<Integer>();
printList(stringList);
printList(integerList);
}
private static void printList(List<?> l)
{
for (Object o : l)
System.out.println(o);
泛型方法
private static <T> T ifThenElse(boolean b, T first, T second)
{
return b ? first : second;
}
静态资源不认识泛型
泛型约束
1.定义类只能用extends关键字不能用通配符?
public class TestMain<T extends B>
{
public static void main(String[] args)
{
new TestMain<C>();
}
}
TestMain类的泛型支能传B的子类。
2.作为方法的参数,可以用通配符<? extends B>实际类型只能是B的子类,<? super B>实际类型只可以是B的父类;
为什么需要泛型?
List list = new ArrayList();
list.add("aaa");
list.add(100);
for (int i = 0; i < list.size(); i++) {
String name = (String) list.get(i); //取出Integer时,运行时出现异常
list可以放任何类型,但是取出时候很可能出现问题。
泛型好处:
1.类型安全。编译期间检查类型,而不是运行期。将类型检查从运行期到编译期间容易找到错误,提高程序可靠性;
2.消除类型强制转化
使用情况
一般和集合使用,提前规定集合类型,在存入和取出保证同一类型。
注意:泛型类型并不会影响对象实例,如:
List<String> stringList = new ArrayList<String>();
List<Integer> integerList = new ArrayList<Integer>();
System.out.println(stringList.getClass() == integerList.getClass());
输出:true
尽量使用精确地类型定义,一般在项目中<实体类>,表明该集合元素类型是实体类型。
例: List<String> stringList = new ArrayList<String>();
List<Integer> integerList = new ArrayList<Integer>();
printList(stringList);
printList(integerList);
}
private static void printList(List<?> l)
{
for (Object o : l)
System.out.println(o);
泛型方法
private static <T> T ifThenElse(boolean b, T first, T second)
{
return b ? first : second;
}
静态资源不认识泛型
泛型约束
1.定义类只能用extends关键字不能用通配符?
public class TestMain<T extends B>
{
public static void main(String[] args)
{
new TestMain<C>();
}
}
TestMain类的泛型支能传B的子类。
2.作为方法的参数,可以用通配符<? extends B>实际类型只能是B的子类,<? super B>实际类型只可以是B的父类;