欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

泛型 知识点 总结

程序员文章站 2024-03-15 13:01:47
...

为什么要有泛型?

泛型实质上就是使程序员定义安全的类型,在没有出现泛型之前,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关键字来判断是否为泛型实例

泛型在子类中的应用

/**
 *要么同时擦除,子类大于等于父类
 * 属性类型
 * 父类中,随父类而定,子类中随子类而定
 * 方法类型
 * 随父类而定
 * 擦除不会类型检查
*/
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>
 * }
 */

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

相关标签: java 泛型