泛型_小记

来源:互联网 发布:mysql 状态 编辑:程序博客网 时间:2024/06/08 13:24
使用ArrayList存储元素 *      给ArrayList集合存储了一些元素,String类型的元素,Integer类型的元素 * 但是通过迭代器遍历元素,由于,系统不知道集合中存储了哪些元素,所有使用String类型接收,就会出现ClassCastException:类转换异常 * 这样设计不够好! *      定义一个数组:字符串数组//      String[] str = new String[3] ;//      str[0] = "hello" ;//      str[1] = "world" ;//      str[2] = 100 ;

数组设计这样好处:提前告诉了开发者,这里只能装String类型的元素,Java根据数组特点—->引出:泛型
泛型:把数据类型的明确工作提供提前到了创建对象或者是调用方法的时期明确的一种特殊类型.参数化类型,可以像参数一样进行传递
格式:
<引用类型>:泛型只能放引用类型
泛型好处:
1)将运行时期异常提前到了编译时期
2)解决了黄色警告线问题
3)获取数据的时候,不用强制类型转换了

一般情况:泛型可以应用在接口,类,或者方法上;主要用在集合中比较多!


测试类:
package Day14_fanxing;

import java.util.ArrayList;
import java.util.Iterator;

/**
* @author Aoman_Hao
*/
public class MainTest1 {

public static void main(String[] args) {    ArrayList<Star> ARR = new ArrayList<Star>();    Star s1 = new Star("TZRRY",22,"女");    Star s2 = new Star("TZR",24,"女");    Star s3 = new Star("Aoman",25,"男");    Star s4 = new Star("TT",23,"男");    ARR.add(s1);    ARR.add(s2);    ARR.add(s3);    ARR.add(s4);    //使用迭代器遍历    Iterator<Star> it = ARR.iterator();    while(it.hasNext()){        Star s = it.next();        System.out.println(s.getName()+"\t"+s.getAge()+"\t"+s.getGender());    }}

}
对象类:

package Day14_fanxing;/** * @author Aoman_Hao */public class Star {private String name;private int age;private String gender;public Star() {    super();    // TODO Auto-generated constructor stub}@Overridepublic boolean equals(Object obj) {    if (this == obj)        return true;    if (obj == null)        return false;    if (getClass() != obj.getClass())        return false;    Star other = (Star) obj;    if (age != other.age)        return false;    if (gender == null) {        if (other.gender != null)            return false;    } else if (!gender.equals(other.gender))        return false;    if (name == null) {        if (other.name != null)            return false;    } else if (!name.equals(other.name))        return false;    return true;}public String getName() {    return name;}public void setName(String name) {}public int getAge() {    return age;}public void setAge(int age) {}public String getGender() {    return gender;}public void setGender(String gender) {}public Star(String name, int age, String gender) {    super();    this.name = name;    this.age = age;    this.gender = gender;}}

泛型可以提供程序的安全性!
早期的时候,用Object类型代表任意的类型,向上转型是不会出现问题的,但是向下转型的时候,由于隐藏了类型转换,导致出现错误!JDK5以后,提供了泛型可以解决程序的安全性

泛型定义在类上

测试类package Day14_fanxing;/** * @author Aoman_Hao */public class ObjTest {    public static void main(String[] args) {        ObjectTool<String> s1 = new ObjectTool<>();        s1.setObj("TZRRY");        ObjectTool<Integer> i1 = new ObjectTool<>();        i1.setObj(22);        System.out.println("姓名:"+s1+"\t"+"年龄"+i1);    }}工具类:package Day14_fanxing;/** * @author Aoman_Hao */public class ObjectTool<T> {private T obj;public T getObj() {    return obj;}public void setObj(T obj) {}public ObjectTool(T obj) {    super();    this.obj = obj;}public ObjectTool() {    super();    // TODO Auto-generated constructor stub}}

泛型定义在接口上

接口:public interface Inter<T> {    public abstract void show(T t) ;}
//接口加入了泛型://第一种情况:接口的子实现类已经知道传递的是什么数据类型/*public class InterImpl<String> implements Inter<String> {    @Override    public void show(String t) {        System.out.println(t);    }}*///第二种情况:接口的子实现类在实现接口的时候,不知道具体的数据类型是什么//在测试类的时候,传入具体数据类型//面向接口编程//JavaEE:Sping框架 :AOP:面向切面编程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") ;        System.out.println("-----------------------------");        //第二种情况:        Inter<Integer> i2 = new InterImpl<Integer>() ;        i2.show(27) ;        Inter<String> i3 = new InterImpl<String>() ;        i3.show("高圆圆") ;    }}

一个专用书写,一个通用书写,具体看开发要求

原创粉丝点击