泛型与反射,看这篇就够了

目录

泛型:编译阶段检查程序是否存在错误的手段。

*泛型的定义

*泛型类的定义:

*使用泛型类:

*使用泛型的好处:

泛型的限制和规则

**泛型方法:

1,使用泛型参数的普通方法:

2,返回值和参数都使用泛型的泛型方法

 泛型接口:

 通配符:

一,?

二,?super Number,设置泛型的下限

三,? extents Number,设置泛型上限

**类型擦除

反射:动态获取信息及调用对象的机制称为反射机制。

1,获取该类的class对象(有JVM产生,全局唯一)

2,通过反射获取构造方法。

通过Method得到的方法,调用方法。


泛型:编译阶段检查程序是否存在错误的手段。

*泛型的定义

所谓泛型就是在类定义时不明确类型,在使用时明确类型

泛型:“<>”使用钻石操作符,<类>

泛型与反射,看这篇就够了_第1张图片

*泛型类的定义:

package 泛型;

public class Point {
    //T类型参数

    //此时xy的类型不确定,但保证了xy的类型一致性,xy的类型在产生对象时确定
    private T x;
    private T y;


    public T getX() {
        return x;
    }

    public void setX(T x) {
        this.x = x;
    }

    public T getY() {
        return y;
    }

    public void setY(T y) {
        this.y = y;
    }


}

*使用泛型类:

将泛型参数定义为String类型,将T x 转换成 String x,在给x赋整形值时就会报错。

泛型与反射,看这篇就够了_第2张图片

多个泛型的使用:使用不同的大写字母来指定不同的类型。

泛型与反射,看这篇就够了_第3张图片

 泛型与反射,看这篇就够了_第4张图片

*使用泛型的好处:

1,编译阶段检查类型是否一致,避免向下转型的强制类型转换的出错问题。

2,代码利于重用。

泛型的限制和规则

  • 泛型的类型参数只能是引用类型,不能使用值类型。
  • 泛型的类型参数可以有多个。
  • 泛型类不是真正存在的类,不能使用instanceof运算符。
  • 泛型类的类型参数不能用在静态申明。
  • 如果定义了泛型,不指定具体类型,泛型默认指定为Ojbect类型。
  • 泛型使用?作为类型通配符,表示未知类型,可以匹配任何类型。因为是未知,所以无法添加元素。
  • 类型通配符上限:,?代表是T类型本身或者是T的子类型。常用于泛型方法,避免类型转换。
  • 类型通配符下限。,?代表T类型本身或者是T的父类型。
  • 除了通配符可以实现限制,类、接口和方法中定义的泛型参数也能限制上限和下限。

**泛型方法:

1,使用泛型参数的普通方法:

    public T fun(T t){
        return t;
    }

2,返回值和参数都使用泛型的泛型方法


    public  T Point(T t){
        return t;
    }

如果一个类是泛型类,泛型方法的类型参数与类的泛型参数无关。只与自己方法定义的泛型参数有关。

一个类是普通类,任然了可以定义泛型方法。但是定义的泛型方法,不能是被static修饰的 ,因为使用static修饰的类方法,无法给泛型传递泛型参数。

泛型类的泛型方法只能实例的。泛型方法在定义泛型时,使用不同的大写字母,避免产生歧义。

泛型与反射,看这篇就够了_第5张图片

使用泛型参数的方法,不能被定义为静态的

泛型与反射,看这篇就够了_第6张图片

 泛型接口:

泛型接口,使用<>钻石操作符定义的接口,在实现接口时,可以继续保留泛型,也可以在实现类中

泛型与反射,看这篇就够了_第7张图片

 泛型与反射,看这篇就够了_第8张图片

 通配符:

三种通配符均可以设置在类和方法中。

一,?

泛型与反射,看这篇就够了_第9张图片

 泛型与反射,看这篇就够了_第10张图片

泛型与反射,看这篇就够了_第11张图片

二,?super Number,设置泛型的下限

泛型与反射,看这篇就够了_第12张图片

 泛型与反射,看这篇就够了_第13张图片

泛型与反射,看这篇就够了_第14张图片

  

三,? extents Number,设置泛型上限

表示最顶层的类型只能是Number和Number类的子类。

 泛型与反射,看这篇就够了_第15张图片

泛型与反射,看这篇就够了_第16张图片

 泛型与反射,看这篇就够了_第17张图片

**类型擦除

泛型:语法糖 

类型擦除:泛型信息其实只在编译阶段,进入JVM后,会将所有和泛型相关的信息擦除掉。

若没有规定泛型上限,则所有的泛型信息都会被擦除为Object类型,

若规定了泛型上限,则擦除为相应的泛型上限类型。

泛型类和普通类进入JVM之后,没有任何区别

经过javac编译以后,生成*.class 文件,泛型就会消失。

泛型与反射,看这篇就够了_第18张图片

 泛型与反射,看这篇就够了_第19张图片

反射:动态获取信息及调用对象的机制称为反射机制。

一切框架的基础

在JVM运行时,

对于JVM中的任何一个类,都能动态获取该类的所有属性和方法。

对于JVM中的任何一个对象,都可以动态获取该对象的属性和方法。

反射的类型:

运行时类型:RTTI

编译时类型:

Person p = new Student();//编译时类型为Person,运行时类型为Student;

运行时类型的获取可以通过反射获取。

泛型与反射,看这篇就够了_第20张图片

1,获取该类的class对象(有JVM产生,全局唯一)

a,调用Class.forName(包名.类名)

b,调用类名.class获取

c,通过对象.getClass()获取。

2,通过反射获取构造方法。

get只能获取public修饰的属性和方法。

getDeclared...()的方法获取全部的属性和方法。

泛型与反射,看这篇就够了_第21张图片

泛型与反射,看这篇就够了_第22张图片

 泛型与反射,看这篇就够了_第23张图片

 泛型与反射,看这篇就够了_第24张图片

 破坏封装性:

泛型与反射,看这篇就够了_第25张图片

 使用class关键字,包括数组,接口编译后产生的class文件就唯一对应一个Class对象,这个对象有JVM产生,使用这个对象就可以获取该类的所有信息。

泛型与反射,看这篇就够了_第26张图片

泛型与反射,看这篇就够了_第27张图片

 泛型与反射,看这篇就够了_第28张图片

通过Method得到的方法,调用方法。

 泛型与反射,看这篇就够了_第29张图片

泛型与反射,看这篇就够了_第30张图片

你可能感兴趣的:(se,linq,泛型,反射,java)