基础:泛型

  • 泛型的参数必须是类类型,不能是简单类型,如int是不行的,要Integer
  • 泛型饿类型个数可以是多个
  • 可以使用extends关键字限制泛型的类型
  • 可以通配符限制泛型的类型

泛型例子

class Mother<T1> {

    T1 t1;

    void setT1(T1 t1) {

        this.t1 = t1;

    }

    T1 getT1() {

        return this.t1;

    }

}

泛型继承

class Son<T1, T2> extends Mother<T1> {

    T2 t2;

    void setT2(T2 t2) {

        this.t2 = t2;

    }

    T2 getT2() {

        return this.t2;

    }

}

继承时不指定夫类类型的话,T1会自动变成Object类型

class Mother2<T1> {
    T1 t1;

    void setT1(T1 t1) {
        this.t1 = t1;
    }

    T1 getT1() {
        return this.t1;
    }
}

class Son<T2> extends Mother2 {

    T2 t2;

    void setT2(T2 t2) {

        this.t2 = t2;

    }

    T2 getT2() {

        return this.t2;

    }

}

// 测试代码
Son2<Integer> son2 = new Son2<>(); // 在创建son2引用的时候,Mother2中的T1自动变成Object类型
son2.setT1("some"); // 可以接收字符串“some”,应为String也是Object的子类
son2.setT2(123);
System.out.println(son2.getT1());
System.out.println(son2.getT2());

限制泛型可用类型

class Limit {

    @Override

    public String toString() {

        return "this is bitson";

    }

}

class SubLimit extends Limit {}

class Mother<T1 extends Limit> { // 这里限制类类型T1必须要是Limit类的子类
    T1 t1;

    void setT1(T1 t1) {
        this.t1 = t1;
    }

    T1 getT1() {
        return this.t1;
    }
}

class Son<T1 extends Limit, T2> extends Mother<T1> { 
    //这里继承Mother的时候必须指定T1是Limit类的子类
    T2 t2;

    void setT2(T2 t2) {
        this.t2 = t2;
    }

    T2 getT2() {
        return this.t2;
    }
}

// 测试方法中运行如下代码
Son<SubLimit, Integer> son = new Son<>(); // son引用的第一个参数必须是继承类Limit的子类
son.setT1(new SubLimit());
System.out.println(son.getT1());

使用类型通配符:“?”

class Limit {
    @Override
    public String toString() {
        return "this is bitson";
    }
}

class SubLimit extends Limit {}

class SubLimit2 extends Limit {}

class Mother<T1 extends Limit> {
    T1 t1;

    void setT1(T1 t1) {
        this.t1 = t1;
    }

    T1 getT1() {
        return this.t1;
    }
}

class Son<T1 extends Limit, T2> extends Mother<T1> {
    T2 t2;

    void setT2(T2 t2) {
        this.t2 = t2;
    }

    T2 getT2() {
        return this.t2;
    }
}

// 测试代码
Son<? extends Limit, Integer> son = null; // 使用类型通配符的话,可以引用Son<SubLimit, Integer>类型或者是Son<SubLimit2, Integer>()类型的实例
son = new Son<SubLimit, Integer>(); 
son = new Son<SubLimit2, Integer>();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。