泛型 知识点 总结

为什么要有泛型?

泛型实质上就是使程序员定义安全的类型,在没有出现泛型之前,java也提供了对Objct的引用"任意化"操作,这种"任意化"操作就是对Object引用进行向下转型及向上转型操作,但是某些强制类型转换的错误也许不会被编译器捕捉,而在运行后出现异常可见强制类型转换存在安全隐患,所以提供了泛型机制.

起因:数据类型不明确

  • 装入数据类型都被当做Object来对待,从而丢失自己的实际类型
  • 获取数据时往往需要强制类型转换,效率低,容易产生错误

泛型的作用

  • 安全 在编译时自动检查类型
  • 省心 所有的强制类型转换都是自动且隐式的,提高代码的重用率

泛型格式

class 类名 <泛型命名> {
     修饰符 构造器 (泛型命名){
     	  //代码块
     	}
     修饰符 返回类型(可以返回泛型值) 方法(泛型命名){
     	//代码块
     		}
     }
public class New {
    public static void main(String[] args) {
        int a = 1;

        Generic<Integer> generic = new Generic<Integer>(a);
        a++;
        int b =generic.come(a);
        System.out.println(b);
    }
}

class Generic<T>{
    public Generic() {
        super();
    }
    public Generic(T t){
        System.out.println("带参构造器:"+t);
    }

    public T come(T t){

        return t;
    }
}

泛型规范起名

  • T type 表示类型
  • KV 代表键值对 Key Value
  • E 代表Element
  • ? 代表不确定的类型

使用泛型注意事项:

  • 泛型不能使用在静态属性和方法上,也不能指定基本数据类型
  • 接口中的泛型只能使用在方法中,不能使用在全局变量中
  • 泛型方法的定义与泛型类没有任何关系
  • 使用泛型时只能访问对象的信息,不能修改对象的信息,例如int a = 1; t++;
  • 泛型不存在多态 例如A<Object> a = new A<String>();
  • 不能使用instanceof关键字来判断是否为泛型实例
  • 声明泛型是能声明引用数据类型,不能声明基本数据类型(int -->Integer)

泛型在子类中的应用

/**
 *要么同时擦除,子类大于等于父类
 * 属性类型
 * 父类中,随父类而定,子类中随子类而定
 * 方法类型
 * 随父类而定
 * 擦除不会类型检查
*/
public abstract class Father<T, T1> {   //abstract 抽象类/抽象方法
    T name;

    public abstract void test(T t2);
    
}
/**
 * 子类声明时指定具体类型
 * 属性类型为具体类型
 * 方法同理
 */
class Child1 extends Father<String, Integer> {   //只能声明引用类型,不能使用具体类型
    String t2;
    String name;

    @Override
    public void test(String t2) {

    }

}
/**
 * 子类为泛型类,类型在使用时确定
 * 子类泛型数量只能比父类多,不能少
 */
class Child2<T1, T, T3> extends Father<T, T1> {
    T1 t2;   //此T1为子类T1

    @Override
    public void test(T t) {

    }

}
/**
 * 子类为泛型类,父类不指定类型,擦除父类的泛型,使用Object替换
 */
class Child3<T1, T> extends Father {
    T1 name2;

    @Override
    public void test(Object t2) {
        // TODO Auto-generated method stub
//		this.name   父类name为Object类型
    }

}
/**
 * 子类与父类同时擦除
 */
class Chind4 extends Father {
    String name;

    @Override
    public void test(Object t2) {
        // TODO Auto-generated method stub

    }

}
/**
 * 错误:子类擦除,父类使用泛型
 * class Chind5 extends Father<T,T1>{
 * String name;
 *
 * @Override public void test(T t) {
 * // TODO Auto-generated method stub
 * <p>
 * }
 */

关于父类泛型和子类泛型的关系,要么同时擦除,要么子类的泛型数大于父类,属性类型父类随父类而定,子类随子类而定
方法类型随父类而定
子类继承为泛型类而父类不指定类型为擦除父类的类型

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值