泛型的使用

本文探讨了Java中泛型类的使用,包括如何在`Person`和`SubPerson`类中定义和使用泛型T,以及如何通过继承和泛型方法实现子类的多态。实例展示了如何创建对象并调用不同泛型的方法,涉及通配符和类型限制的应用。
摘要由CSDN通过智能技术生成
  • 泛型类
/*
当创建Person的对象时,需要指定类型,若不指定则默认Object类型,若制定为String类型,则在类Person中,T的位置全部换成String,即属性String ord;
*/
class Person<T>{
    private String name;
    //定义泛型类T
    T ord;

    public Person() {
    }

    public Person(String name, T ord) {
        this.name = name;
        this.ord = ord;
    }

    public void setOrd(T ord){
        this.ord=ord;
    }
    public T getOrd(){
        return ord;
    }
    
}
  • 泛型类的继承和泛型方法
/*
当创建子类SubPerson的对象时,若制定T为String,则父类中的所有T的位置和父类中T的位置全部换成String
也可以明确指定父类中泛型如class SubPerson<T> extends Person<String>
*/
class SubPerson<T> extends Person<T> {
    T a;

    public SubPerson() {

    }
    public SubPerson(T a) {
        this.a = a;
    }
	//泛型方法,此处用泛型,便可以将任意类型的List放入其中实现多态
    public <E> void getList(List<E> list) {
        ArrayList<E> es = new ArrayList<>();
        for (E e : list) {
            es.add(e);
        }
       
    }
}

  • 整体测试
package JavaFour;

import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName : CreateNormalTest  //类名
 * @Description : 自定义泛型  //描述
 * @Author : Gao //作者
 * @Date: 2022/3/1  21:17
 */

public class CreateNormalTest {
    public static void main(String[] args) {
        SubPerson<Integer> integerSubPerson = new SubPerson<>(1);
        //调用父类的getOrd()方法,即表明子类在创建对象时也指明了父类的泛型情况
        Integer ord = integerSubPerson.getOrd();
        System.out.println(ord);

        ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(9888);
        //调用泛型方法,便可以将Integer类型的传入方法中
        List<Integer> list = integerSubPerson.getList(arrayList);
        for (Integer integer : list) {
            System.out.println(integer);
        }


    }
}

class Person<T> {
    private String name;
    //定义泛型类T
    T ord;

    public Person() {
    }

    public Person(String name, T ord) {
        this.name = name;
        this.ord = ord;
    }

    public void setOrd(T ord) {
        this.ord = ord;
    }

    public T getOrd() {
        return ord;
    }

}


class SubPerson<T> extends Person<String> {
    T a;

    public SubPerson() {

    }
    public SubPerson(T a) {
        this.a = a;
    }

    public <E> List<E> getList(List<E> list) {
        ArrayList<E> es = new ArrayList<>();
        for (E e : list) {
            es.add(e);
        }
        return es;
    }
}

  • 通配符的使用
/*
若A是B的父类,但List<A>和List<B>并无父类关系
若想用多态则需要将其赋予带通配符的List<?>
注意:带赋值给带通配符的则不能添加数据
且取出的数据是Object类型的
*/

@Test
public void test(){

        //
        List<?> list = null;
        List<String> list3 = new ArrayList<>();
        list3.add("AA");
        list3.add("BB");
        list3.add("CC");
        list = list3;
        //添加(写入):对于List<?>就不能向其内部添加数据。
        //除了添加null之外。
//        list.add("DD");
//        list.add('?');
        list.add(null);

        //获取(读取):允许读取数据,读取的数据类型为Object。
        Object o = list.get(0);
       }
  • 带有类型限制的通配符
/*
<? extends Person> 只能是Peron的子类
<? super Person> 只能是Person的父类
*/
  • 统配符合泛型方法

若只是对数据进行读则用通配符,若需要对数据进行修改则建议使用泛型方法。

泛型(Generics)是一种在编程语言中实现参数化类型的技术,可以让我们编写更加灵活和通用的代码。下面是一个泛型使用案例: 假设我们有一个需求,需要实现一个通用的栈(Stack)数据结构,可以存储任何类型的元素。我们可以使用泛型来实现这个通用的栈数据结构。以下是一个基于Java的示例代码: ```java public class Stack<T> { private ArrayList<T> items; public Stack() { items = new ArrayList<T>(); } public void push(T item) { items.add(item); } public T pop() { if (items.isEmpty()) { throw new RuntimeException("Stack is empty"); } return items.remove(items.size() - 1); } public boolean isEmpty() { return items.isEmpty(); } } ``` 在上面的代码中,我们使用了一个类型参数 `T`,它代表任何类型。我们在类的定义中使用了 `<T>` 来声明这个类是一个泛型类,它可以接受任何类型的元素。在类的内部,我们使用 `T` 来代表元素的类型。我们将元素存储在一个 `ArrayList<T>` 中,这个 `ArrayList` 可以存储任何类型的元素。 我们定义了三个方法:`push()`、`pop()` 和 `isEmpty()`。`push()` 方法用于将元素压入栈中,`pop()` 方法用于弹出栈顶元素,并从栈中移除它,`isEmpty()` 方法用于判断栈是否为空。 使用泛型,我们可以使用这个通用的栈数据结构来存储任何类型的元素,例如: ```java Stack<Integer> intStack = new Stack<Integer>(); intStack.push(1); intStack.push(2); intStack.push(3); intStack.pop(); // 返回 3 intStack.pop(); // 返回 2 Stack<String> strStack = new Stack<String>(); strStack.push("Hello"); strStack.push("World"); strStack.pop(); // 返回 "World" ``` 在上面的示例代码中,我们分别使用了 `Stack<Integer>` 和 `Stack<String>` 来存储整数和字符串类型的元素。由于使用泛型,这个通用的栈数据结构可以存储任何类型的元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值