首页 > 编程语言 > 详细

Javase学习07-泛型

时间:2021-05-19 01:09:43      阅读:18      评论:0      收藏:0      [点我收藏+]

1.泛型定义

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

参数化类型:把类型当作是参数一样传递

<数据类型> 只能是引用类型,如<T>

泛型类就是把泛型定义在类上,用户使用该类的时候,才把类型明确下来。

如此,用户明确了什么类型,该类就代表着什么类型。这样用户在使用的时候就不用担心强转的问题,运行时转换异常的问题了。

由此可派生出泛型接口、泛型方法等

2.泛型实例

2.1 首先定义一个泛型接口

该接口定义了增删查改等基本功能

技术分享图片
package polymorphic;

/**
 * @author: TSCCG
 * @date: 2021/5/18
 */
public interface Super<T>{
    /**
     * 1.定义添加数据功能
     * @param data
     */
    void add(T data);

    /**
     * 2.定义删除数据功能
     * @param index
     */
    void delete(int index);

    /**
     * 3.定义查询数据功能
     * @param index
     * @return
     */
    T get(int index);

    /**
     * 4.定义修改数据功能
     * @param index
     * @param newValue
     */
    void update(int index,T newValue);

    /**
     * 5.定义打印数据功能
     */
    void print();
}
View Code

2.2 定义一个User类

技术分享图片
package polymorphic;

/**
 * @author: TSCCG
 * @date: 2021/5/18
 */
public class User {
    private String userName;
    private String passWord;

    public User(String userName, String passWord) {
        this.userName = userName;
        this.passWord = passWord;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassWord() {
        return passWord;
    }

    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }

    @Override
    public String toString() {
        return "User{" +
                "userName=‘" + userName + ‘\‘‘ +
                ", passWord=‘" + passWord + ‘\‘‘ +
                ‘}‘;
    }
}
View Code

2.3 数组类实现泛型接口

技术分享图片
package polymorphic;


/**
 * @author: TSCCG
 * @date: 2021/5/18
 */
public class SuperArray <T>implements Super<T>{
    private Object[] arr;
    private int currentIndex = -1;

    public SuperArray(int size) {
        arr = new Object[size];
    }

    /**
     * 定义数组默认长度为10
     */
    public SuperArray() {
        this(10);
    }

    /**
     * 1.增加数据
     */
    @Override
    public void add(T data) {
        currentIndex++;
        if (currentIndex > arr.length) {
            Object[] newArr = new Object[currentIndex * 2];
            for (int j = 0; j < arr.length; j++) {
                newArr[j] = arr[j];
            }
            arr = newArr;
        }
        arr[currentIndex] = data;
    }

    /**
     * 2.删除某个数据
     */
    @Override
    public void delete(int index) {
        if (index < 0 || index > currentIndex) {
            System.out.println("数组中没有这个元素!");
        } else {
            for (int i = index; i < currentIndex; i++) {
                arr[i] = arr[i + 1];
            }
            currentIndex--;
        }
    }

    /**
     * 3.通过下标查询某个数据
     * @return
     */
    @Override
    public T get(int index) {
        return (T)arr[index];
    }

    /**
     * 4.修改数据
     */
    @Override
    public void update(int index, T newValue) {
        arr[index] = newValue;
    }

    /**
     * 5.输出数据
     */
    @Override
    public void print() {
        for (int i = 0; i <= currentIndex; i++) {
            if (i == currentIndex) {
                System.out.println(arr[i]);
            } else {
                System.out.println(arr[i]);
            }

        }
    }
}
View Code

2.4 链表类实现泛型接口

泛型节点类:
技术分享图片
package polymorphic;

/**
 * @author: TSCCG
 * @date: 2021/5/18
 */
public class Node <T>{

    private T data;
    private Node next;

    public Node(T data) {
        this.data = data;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public Node getNext() {
        return next;
    }

    public void setNext(Node next) {
        this.next = next;
    }
}
View Code
链表类:
技术分享图片
package polymorphic;


/**
 * @author: TSCCG
 * @date: 2021/5/16
 */
public class SuperLink <T>implements Super<T>{

    private Node head;
    private int size;

    /**
     * 1.从链表尾部添加节点
     */
    @Override
    public void add(T data) {
        //创建新节点
        Node newNode = new Node(data);
        if (size == 0) {
            //当链表为空时,使新节点成为头节点
            head = newNode;
        } else {
            //当链表不为空时,找到当前链表的末节点,使其指向新节点,新节点成为新的末节点
            findEnd(head).setNext(newNode);
        }
        //链表长度加1
        size++;
    }

    /**
     * 2.通过下标删除节点
     */
    @Override
    public void delete(int index) {
        Node node = getNode(index);
        //如果删除的节点是第一个节点,直接使head的后一位节点成为新的头节点即可
        if (node.equals(head)) {
            head = node.getNext();
        } else {
            getNode(index - 1).setNext(node.getNext());
        }
        size--;
    }

    /**
     * 3.通过下标找到目标节点
     * @return
     */
    public Node getNode(int index) {
        Node tempNode = head;
        for (int i = 0; i < index; i++) {
            tempNode = tempNode.getNext();
        }
        return tempNode;
    }

    /**
     * 3.1通过下标返回该节点的值
     * @param index
     * @return
     */
    @Override
    public T get(int index) {
        return (T)(getNode(index).getData());
    }
    /**
     * 3.2找到尾节点
     */
    public Node findEnd(Node node) {
        if (node.getNext() == null) {
            return node;
        }
        //使用递归
        return findEnd(node.getNext());
    }

    /**
     * 4.更改目标节点的值
     */

    @Override
    public void update(int index, T newValue) {
        //首先根据下标找到目标节点,然后将新的值赋给它
        getNode(index).setData(newValue);
    }

    /**
     * 5.显示所有节点信息
     */
    @Override
    public void print() {
        //因为不能随意改变head的位置,故定义一个临时节点代替head
        Node tempNode = head;
        //当临时节点不为空时,说明仍在链表内
        while (tempNode != null) {
            if (tempNode.getNext() == null) {
                System.out.println(tempNode.getData());
            } else {
                System.out.println(tempNode.getData());
            }
            tempNode = tempNode.getNext();
        }
    }

}
View Code

2.5 测试类

技术分享图片
package polymorphic;

/**
 * @author: TSCCG
 * @date: 2021/5/18
 */
public class Test {
    public static void main(String[] args) {
        //实例化对象时可传入任意类型
        Super<User> su = new SuperLink<>();
//        Super<User> su = new SuperArray<>();
        su.add(new User("张三","123"));
        su.add(new User("李四","234"));
        su.add(new User("王五","345"));
        su.add(new User("赵六","456"));
        su.print();
        su.delete(2);
        System.out.println("删除后:");
        su.print();
        System.out.println("查询下标为0的元素:");
        System.out.println(su.get(0));
        su.update(1,new User("阿巴","666"));
        System.out.println("改变第1个元素的内容");
        su.print();
    }

}
View Code

结果:

技术分享图片
User{userName=‘张三‘, passWord=‘123‘}
User{userName=‘李四‘, passWord=‘234‘}
User{userName=‘王五‘, passWord=‘345‘}
User{userName=‘赵六‘, passWord=‘456‘}
删除后:
User{userName=‘张三‘, passWord=‘123‘}
User{userName=‘李四‘, passWord=‘234‘}
User{userName=‘赵六‘, passWord=‘456‘}
查询下标为0的元素:
User{userName=‘张三‘, passWord=‘123‘}
改变下标为1的元素的内容
User{userName=‘张三‘, passWord=‘123‘}
User{userName=‘阿巴‘, passWord=‘666‘}
User{userName=‘赵六‘, passWord=‘456‘}
View Code

 

Javase学习07-泛型

原文:https://www.cnblogs.com/TSCCG/p/14783226.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!