Java泛型

泛型<>:
 * 1、泛型只能使用引用数据类型,不能使用基本数据类型
 * 2、常用参数 T-type、K-key、V-value、E-element 和?(表示类型不定,使用时确定类型)
 *     ? extends  <= 子类或自身
 *     ? super  >= 自身或父类
 *     此处的对比指的是前面的?
 * 3、泛型类和泛型变量不能使用static修饰  因为static是在编译时处理 而泛型是在使用时处理
 * 4、泛型方法可以使用static修饰,泛型方法只能访问不能修改
 * 5、泛型抽象类,子类继承泛型抽象类时
 *     泛型擦除后默认为Object类型
 * (1)当父类擦除泛型时,子类随意
 * (2)当父类没有擦除时,子类泛型范围要大于等于父类定义的泛型范围
 * (3)父类有多个泛型或子类定义多个泛型时,子类泛型的顺序不必与父类相同
 * 属性类型(泛型)  父类随父类而定,子类随子类而定
 * 重写方法(泛型)  随父类而定
 * 6、泛型接口的用法同5

泛型方法的例子:

/**
 * 类没有定义泛型,只是方法定义泛型
 */
public class Test {

    public <T> void test1(T t) {

    }

    public <T> String test2(T t) {
        return "有返回值的泛型方法。";
    }

}

/**
 * 类定义的泛型与方法中的泛型相同
 */
public class Test<T> {

    public void test1(T t) {

    }

    public String test2(T t) {
        return "有返回值的泛型方法。";
    }

}

泛型抽象类的例子:

/**
 * 抽象泛型类
 * 泛型个数
 */
public abstract class Father<T> {

    T t;

    public abstract void getT(T t);

}

/**
 * 父类擦除,子类也擦除 
 * 父类擦除后,类型默认为Object
 */
public class ChildOne extends Father {
    @Override
    public void getT(Object t) {
        System.out.println(t);
    }
}

/**
 * 父类擦除,子类重新定义泛型(泛型个数任意) 
 * 父类擦除后,类型默认为Object
 */
public class ChildTwo<T, T1> extends Father {

    T t;
    T1 t1;

    public void getT1(T1 t1) {
        System.out.println(t1);
    }

    @Override
    public void getT(Object t) {

    }

}

/**
 * 子类指定泛型类型
 */
public class ChildThree extends Father<String> {

    @Override
    public void getT(String t) {
        System.out.println(t);
    }

}

/**
 * 子类指定泛型类型且定义新的泛型
 */
public class ChildFour<T> extends Father<String>{

    public T t;
    @Override
    public void getT(String t) {
        System.out.println(t);
    }

}

/**
 * 子类未指定泛型类型,则必须定义与父类相同的泛型
 */
public class ChildFive<T> extends Father<T>{

    @Override
    public void getT(T t) {
        System.out.println(t);
    }

}

/**
 * 子类未指定泛型类型,则必须定义与父类相同的泛型,可以再定义其他泛型且顺序随意
 */
public class ChildSix<T1,T> extends Father<T>{

    T1 t1;
    
    @Override
    public void getT(T t) {
        System.out.println(t);
    }

}

测试如下:

public class Test {

    public static void main(String[] args) {
        ChildOne childOne = new ChildOne();
        childOne.getT("父类擦除,子类也擦除。继承父类变量、方法中的泛型类型默认为Object");
        ChildTwo<Integer, String> childTwo = new ChildTwo<>();
        childTwo.getT1("父类擦除,子类擦除后重新定义新的泛型(泛型个数任意)类型。此处定义了两个泛型,为Integer和String");
        ChildThree childThree = new ChildThree();
        childThree.getT("父类未擦除,子类指定泛型类型。此处指定为String");
        ChildFour<Integer> childFour = new ChildFour<>();
        childFour.t=123;
        childFour.getT("父类未擦除,子类指定泛型类型且定义新的泛型(泛型个数任意)。此处指定为String");
        ChildFive<String> childFive=new ChildFive<>();
        childFive.getT("父类未擦除,子类未指定泛型类型,则子类必须定义与父类相同的泛型。");
        ChildSix<Integer,String> childSix=new ChildSix<>();
        childSix.getT("父类未擦除,子类未指定泛型类型,则必须定义与父类相同的泛型,可以再定义其他泛型且顺序随意。");
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值