自定义泛型类、接口、方法

举报
周小末天天开心 发表于 2022/12/31 17:28:48 2022/12/31
【摘要】 自定义泛型类基本语法class 类名<T,R...> {//...表示可以有多个泛型 成员}使用细节(1)普通成员可以使用泛型(属性、方法)(2)使用泛型的数组,不能初始化(3)静态方法中不能使用类的泛型(4)泛型类的类型,是在创建对象时确定的(因为创建对象时,需要指定确定类型)(5)如果在创建对象时,没有指定类型,默认为Object应用案例import java.util.Array...

自定义泛型类

基本语法

class 类名<T,R...> {//...表示可以有多个泛型
    成员
}

使用细节

(1)普通成员可以使用泛型(属性、方法)

(2)使用泛型的数组,不能初始化

(3)静态方法中不能使用类的泛型

(4)泛型类的类型,是在创建对象时确定的(因为创建对象时,需要指定确定类型)

(5)如果在创建对象时,没有指定类型,默认为Object

应用案例

import java.util.Arrays;
@SuppressWarnings({"all"})
public class CustomGeneric_ {
    public static void main(String[] args) {
    
        //T=Double, R=String, M=Integer
        Tiger<Double,String,Integer> g = new Tiger<>("john");
        g.setT(10.9); //OK
        //g.setT("yy"); //错误,类型不对
        System.out.println(g);
        Tiger g2 = new Tiger("john~~");//OK T=Object R=Object M=Object
        g2.setT("yy"); //OK ,因为 T=Object "yy"=String 是 Object 子类
        System.out.println("g2=" + g2);
    }
}


//1. Tiger 后面泛型,所以我们把 Tiger 就称为自定义泛型类
//2, T, R, M 泛型的标识符, 一般是单个大写字母
//3. 泛型标识符可以有多个. //4. 普通成员可以使用泛型 (属性、方法)
//5. 使用泛型的数组,不能初始化
//6. 静态方法中不能使用类的泛型
class Tiger<T, R, M> {
    String name;
    R r; //属性使用到泛型
    M m;
    T t;
    //因为数组在 new 不能确定 T 的类型,就无法在内存开空间
    T[] ts;
    public Tiger(String name) {
        this.name = name;
    }
    public Tiger(R r, M m, T t) {//构造器使用泛型
        this.r = r;
        this.m = m;
        this.t = t;
    }
    public Tiger(String name, R r, M m, T t) {//构造器使用泛型
        this.name = name;
        this.r = r;
        this.m = m;
        this.t = t;
    }
    
    //因为静态是和类相关的,在类加载时,对象还没有创建
    //所以,如果静态方法和静态属性使用了泛型,JVM 就无法完成初始化
    // static R r2;
    // public static void m1(M m) {
    //
    // }
    
    //方法使用泛型
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public R getR() {
        return r;
    }
    public void setR(R r) {//方法使用到泛型
        this.r = r;
    }
    public M getM() {//返回类型可以使用泛型. return m;
    }
    public void setM(M m) {
        this.m = m;
    }
    public T getT() {
        return t;
    }
    public void setT(T t) {
        this.t = t;
    }
    @Override
    public String toString() {
        return "Tiger{" +
        "name='" + name + '\'' +
        ", r=" + r +
        ", m=" + m +
        ", t=" + t +
        ", ts=" + Arrays.toString(ts) +
        '}';
    }
}

自定义泛型接口

基本语法

interface 接口名<T,R...> {

}

使用细节

(1)接口中,静态成员也不能使用泛型(这个和泛型类规定一样)

(2)泛型接口的类型,在继承接口或者实现接口时确定

(3)没有指定类型,默认为Object

自定义泛型方法

基本语法

修饰符 <T,R...>返回类型 方法名(参数列表) {
}

使用细节

(1)泛型方法,可以定义在普通类中,也可以定义在泛型类中

(2)当泛型方法被调用时,类型会确定

(3)public void eat(E e){},修饰符后没有<T,R...> eat 方法不是泛型方法,而是使用了泛型

泛型的继承和通配符

说明

(1)泛型不具备继承性

(2)<?>:支持任意泛型类型

(3)<? extends A>:支持A类以及A类的子类,规定了泛型的上限

(4)<? super A>:支持A类以及A类的父类,不限于直接父类,规定了泛型的下限

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。