自定义泛型

文章介绍了Java中的自定义泛型类的基本语法和注意事项,包括类定义、泛型属性和方法的使用,以及泛型数组的声明。示例中展示了如何创建和使用泛型类,强调了在静态方法中不能使用类的泛型以及在创建对象时必须指定泛型类型。最后,给出了一个小练习,讨论了给定代码的正确性和原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自定义泛型类(难度)

基本语法
class 类名 <T, R...> { //...表示可以有多个泛型

成员
}

注意细节

  1. 普通成员可以使用泛型(属性、方法)
  2. 使用泛型的数组,不能初始化
  3. 静态方法中不能使用类的泛型
  4. 泛型类的类型,是在创建对象时确定的(因为创建对象时,需要指定确定类型)
  5. 如果在创建对象时,没有指定类型,默认为Object

举例说明

public class Exercise04 {
    public static void main(String[] args) {
    }
}
//1、Tiger后面泛型,所以我们把Tiger就称为自定义泛型类
//2、T,R,M 泛型的标识符,一般是单个大写字母
//3、泛型标识符可以有多个·
//4、普通成员可以使用泛型(属性、方法)
//5、使用泛型的数组,不能初始化
class Tiger <T,R,M>{
    String name;
    T t; //属性使用泛型
    R r; //属性使用泛型
    M m; //属性使用泛型
    T[] ts; //可以使用泛型定义
    //T[] a = new T[8]; //错误,不能初始化,因为数组在new不能确定 T 的类型,就无法在内存开空间
    // 构造器使用泛型
    public Tiger(String name, T t, R r, M m) { // 构造器使用泛型
        this.name = name;
        this.t = t;
        this.r = r;
        this.m = m;
    }

    //方法使用泛型
    public T getT() {
        return t;
    }

    public void setT(T t) {
        this.t = t;
    }

    //因为静态是和类相关的,在类加载时,对象还没有创建
    //所以,如果静态方法和静态属性使用了泛型,JVM就无法完成初始化static Rr2;
    //static R r2; //错误
    //public static void m1(M m) { //错误

   // }
}

小练习

说明自定义泛型代码是否正确,,并说明原因。
MyGeneric <Double,String,Integer> g = newMyGeneric<>("john");
g.setT(10.9);
g.setT("yy");
System.out.println(g);
MyGeneric g2 =new MyGeneric("john~~");

g2.setT("yy");
System.out.println("g2=" +g2);

public class Exercise05 {
    public static void main(String[] args) {
        //T=Double,R=String,M=Integer
        MyGeneric <Double,String,Integer> g = new MyGeneric<>("john");
        g.setT(10.9); //正确
        //g.setT("yy"); 错误,类型不对,这里应该是 double类,不是 String类
        System.out.println(g);
        //正确,但这里没有指定类型,默认为Object类,所以 T=Object,R=Object,M=Object
        MyGeneric g2 =new MyGeneric("john~~");
        g2.setT("yy"); //正确,因为 T=Object,而"yy"是String类,是Object的子类
        System.out.println("g2=" +g2);
    }
}
class MyGeneric <T,R,M>{
    T t; //属性使用泛型
    R r; //属性使用泛型
    M m; //属性使用泛型
    String name;

    public MyGeneric(String name) {
        this.name = name;
    }

    public MyGeneric(T t, R r, M m) {
        this.t = t;
        this.r = r;
        this.m = m;
    }

    public T getT() {
        return t;
    }

    public void setT(T t) {
        this.t = t;
    }

    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;
    }
}

输出:

MyGeneric{t=10.9, r=null, m=null, name='john'}
g2=MyGeneric{t=yy, r=null, m=null, name='john~~'}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值