JDK5新特性之泛型

泛型是一种把类型明确的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型。

泛型的格式:

    <数据类型>

    注意:此处的数据类型这能是引用类型

    好处:

      A:把运行时期的问题提前到了编译期间

      B:避免了强制类型转换

      C:优化了程序设计

import java.util.ArrayList;public class ArrayListDemo {
    public static void main(String[] args) {

        ArrayList array = new ArrayList();

        array.add("hello");
        array.add("world");
        array.add("java");for (int x = 0; x < array.size(); x++) {
            String s = (String) array.get(x);//由于没有使用泛型所以要进行强制类型转换
            System.out.println(s);
        }
    }
}

那么泛型在什么地方要使用呢?

  我们可以查看API,如果类、接口和抽象类的后面跟有<E>就说明要使用泛型,一般来说就是在集合中使用。

泛型的由来:

  在早期的时候我们可以使用Object类型来接收任意的对象类型,但是在实际的使用过程中,向上转型是没有任何问题的,但是在向下转型的时候其实隐含了类型转换的问题,会有强制类型转换的问题,也就存在着隐患,所以Java在JDK5以后就提供了泛型来解决这个安全问题,提高程序的安全性。

泛型的应用:

  A:泛型类

    就是把泛型定义在类上

    格式:public class 类名<泛型类型 1,...>

    注意:泛型的类型必须是引用类型

//定义一个泛型类
 class ObjectTool<T> {
	private T obj;

	public T getObj() {
		return obj;
	}

	public void setObj(T obj) {
		this.obj = obj;
	}
}

//定义一个测试类
public class ObjectToolDemo {
	public static void main(String[] args) {

		ObjectTool<String> ot = new ObjectTool<String>();
		// ot.setObj(new Integer(27)); //这个时候编译期间就过不去
		ot.setObj(new String("林青霞"));
		String s = ot.getObj();
		System.out.println("姓名是:" + s);

		ObjectTool<Integer> ot2 = new ObjectTool<Integer>();
		// ot2.setObj(new String("风清扬"));//这个时候编译期间就过不去
		ot2.setObj(new Integer(27));
		Integer i = ot2.getObj();
		System.out.println("年龄是:" + i);
	}
}

  B:泛型方法

    就是把泛型定义在了方法上

    格式:public<泛型类型> 返回类型 方法名(泛型类型)  

    好处:方法可以接收任意类型的数据

public class ObjectTool {
    //定义一个泛型方法
	public <T> void show(T t) {
		System.out.println(t);
	}
}

//定义一个测试类
public class ObjectToolDemo {
	public static void main(String[] args) {

		// 定义泛型方法后
		ObjectTool ot = new ObjectTool();
		ot.show("hello");
		ot.show(100);
		ot.show(true);
	}
}

  C:泛型接口

    就是把泛型定义在接口上

    格式:public interface 接口名<泛型类型1...>

    泛型接口的实现类在实现接口的时候分以下两种情况

    第一种情况:实现该接口的时候已经知道是什么类型

//定义一个泛型接口
 interface Inter<T> {
	public abstract void show(T t);
}

//泛型类的实现类在实现接口是知道是什么类型的了
public class InterImpl implements Inter<String> {

	@Override
	public void show(String t) {
		System.out.println(t);
	}
 }

//测试类
public class InterDemo {
	public static void main(String[] args) {

		 Inter<String> i = new InterImpl();
		i.show("hello");

	}
}

    第二种情况:实现该接口的时候还不知道是什么类型

//定义一个泛型类
public interface Inter<T> {
	public abstract void show(T t);
}

//实现该接口的时候还不知道是什么类型的
public class InterImpl<T> implements Inter<T> {

	@Override
	public void show(T t) {
		System.out.println(t);
	}
}

//测试类
public class InterDemo {
	public static void main(String[] args) {

		Inter<String> i = new InterImpl<String>();
		i.show("hello");

		Inter<Integer> ii = new InterImpl<Integer>();
		ii.show(100);
	}
}

泛型高级(通配符)

  泛型通配符<?>

     表示任意类型,如果没有明确,那么就是Object以及任意的Java类了

  ? extends E

     向下限定,E及其子类

  ? super E

     向上限定,E及其父类

public class GenericDemo {
	public static void main(String[] args) {
		// 泛型如果明确的写的时候,前后必须一致
		Collection<Object> c1 = new ArrayList<Object>();
		// Collection<Object> c2 = new ArrayList<Animal>();//报错
		// Collection<Object> c3 = new ArrayList<Dog>();//报错
		// Collection<Object> c4 = new ArrayList<Cat>();//报错

		// ?表示任意的类型都是可以的
		Collection<?> c5 = new ArrayList<Object>();
		Collection<?> c6 = new ArrayList<Animal>();
		Collection<?> c7 = new ArrayList<Dog>();
		Collection<?> c8 = new ArrayList<Cat>();

		// ? extends E:向下限定,E及其子类
		// Collection<? extends Animal> c9 = new ArrayList<Object>();//报错
		Collection<? extends Animal> c10 = new ArrayList<Animal>();
		Collection<? extends Animal> c11 = new ArrayList<Dog>();
		Collection<? extends Animal> c12 = new ArrayList<Cat>();

		// ? super E:向上限定,E极其父类
		Collection<? super Animal> c13 = new ArrayList<Object>();
		Collection<? super Animal> c14 = new ArrayList<Animal>();
		// Collection<? super Animal> c15 = new ArrayList<Dog>();//报错
		// Collection<? super Animal> c16 = new ArrayList<Cat>();//报错
	}
}

class Animal {
}

class Dog extends Animal {
}

class Cat extends Animal {
}

  

时间: 2024-12-27 17:08:59

JDK5新特性之泛型的相关文章

Java API —— JDK5新特性

JDK5新特性 自动拆装箱.泛型.增强for.静态导入.可变参数.枚举   1.增强for概述 1)简化数组和Collection集合的遍历 2)格式: for(元素数据类型 变量 : 数组或者Collection集合) { 使用变量即可,该变量就是元素 } 3)好处:简化遍历 4)注意事项:增强for的目标要判断是否为null 例子1: package jdk5; import java.util.ArrayList; import java.util.List; /** * Created

Java 8 新特性之泛型的类型推导

1. 泛型究竟是什么? 在讨论类型推导(type inference)之前,必须回顾一下什么是泛型(Generic).泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.通俗点将就是“类型的变量”.这种类型变量可以用在类.接口和方法的创建中.理解Java泛型最简单的方法是把它看成一种便捷语法,能节省你某些Java类型转换(casting)上的操作: List<Apple> box = new ArrayList<Apple>();

JDK5新特性之 可变参数的方法

可变参数的方法:不知道这个方法该定义多少个参数 注意: > 参数实际上是数组 > 必须写在参数列表最后一个 package cn.itcast.day24.varparam; import java.lang.reflect.Type; /** * * JDK5新特性之 可变参数 * 定义方法时,不知道该定义多少个参数 * * 格式: * 修饰符 方法返回值 方法名(数据类型 ... 变量名){} * * 注意: * 可变参数实际上是一个数组 * 可变参数必须写在方法的参数列表的最后 * */

泛型,JDK5新特性,List集合子实现类,Map集合,Set/TreeSet集合,asList

一.泛型(JDK5以后新特性) 1.概述:泛型直接规定集合的存储类型,将明确的集合类型的工作推迟到了创建对象或者调用方法的时候,属于一种参数化类型,可作参数传递.2.优点(1)将运行时期异常提前到了编译时期:(2)优化了设计,解决了×××警告线问题:(3)避免了强制类型转换, ,解决了向下类型转换出现的问题ClassCastException:(4)泛型的引出可以提供程序的安全性.3.泛型定义在类上(1)格式:public class 类名<T>{--}(2)实例:实体类: 测试类: 4.泛型

java 基础加强(myeclipse,debug,junit,JDK5新特性,反射)

思维导图 1.myeclipse的安装和使用 *eclipse:是一个免费的开发工具 *myeclipse:是一个收费的插件,破解myeclipse, **安装目录的要求: 不能有中文和空格 **安装完成之后,选择一个工作空间 ,这个工作空间不能有中文和空格 *破解myeclipse **运行run.bat文件,但是运行之前,必须要安装jdk,通过配置环境变量 *myeclipse的使用 *创建一个工程 -类型 javaproject  web  project -选择依赖的jdk,可以使用my

JAVA学习-Java新特性(泛型、枚举、Annotation)

所谓的Java新特性现在都是指从JDK 1.5之后开始的,例如,在前面已经学习过两个新特性:switch支持String判断(JDK 1.7提供的).自动装箱和拆箱.可变参数.foreach.静态导入.泛型.枚举.Annotation. 对于所有的新特性,我的个人建议:有些新特性你今天一定是不知道怎么用的,我们今天只是来看一下这些语法,至于使用方面,慢慢来观察. 1.可变参数(理解) 如果说现在有这样一个要求,要求实现整数的加法操作,并且方法可以接收任意多个整型数据一起实现加法操作. 如果按照传

JDK5新特性--可变参数

1.可变参数的引入 package cn; /**  * 可变参数  */ public class ChangeParameterDemo { public static void main(String[] args) { //2个数求和 int a = 10; int b = 20; int result = sum(a,b); System.out.println("result:"+result); int c = 30; result = sum(a,b,c); Syste

iOS9新特性之泛型

泛型:限制类型 为什么退出泛型:迎合swift 泛型的作用:1.限制类型:2.提高代码规范,减少沟通成本,一看就知道集合中是什么东西 泛型定义 用法:类型<限制类型> 泛型声明:在声明类的时候,在类的后面<泛型名称> 泛型使用错误在 OC中仅仅是报警告 泛型的好处:1.从数组中取出来,可以使用点语法 2.给数组添加元素,有提示 泛型在开发中的使用场景:1.用于限制集合类型 id是不能使用点语法的 为什么集合可以使用泛型?使用泛型,必须先声明泛型?=>如何声明泛型 自定义泛型?

JDK5新特性之线程同步集合(五)

一. 传统集合: 传统方式下的Collection在迭代集合时, 不同意对集合进行改动: public class CollectionModifyExceptionTest { public static void main(String[] args) { Collection<String> list = new ArrayList<String>(); list.add("aaa"); list.add("bbb"); list.ad