# Task1 **Repository Path**: charming-c/Task1 ## Basic Information - **Project Name**: Task1 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-05-10 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # java中泛型的简单介绍: ## 1.含义: * Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。 * 泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。 ### 例子: 1.不使用泛型: ``` List arrayList = new ArrayList<>(); //这里就没有指明一个数组他要操作什么数据类型,所以就可以往里面传入int或者String类型的数 arrayList.add("abc"); arrayList.add(100); System.out.println(list); ``` 打印出`[aaa, 100] ` 2.使用泛型: ![输入图片说明](https://images.gitee.com/uploads/images/2020/0516/155229_9eaeb563_5703396.png "2020-05-16 15-50-55 的屏幕截图.png") * 这里却可以看到报错了,因为数组定义时限定了它只能操作String类型的数据,编译不通过。这里参数化类型就是这个意思。 ## 2.泛型的一个特性: ![输入图片说明](https://images.gitee.com/uploads/images/2020/0516/160646_a36deef2_5703396.png "2020-05-16 16-05-51 的屏幕截图.png") 这里的equals()是比较两个对象的内容是否相等 运用反射获取运行时的类对象,发现两个不同参数类型的泛型数组类型相同,这里就可以知道,泛型在编译时会检查类型,也就是<>里面的内容。在编译阶段,正确检验泛型结果之后,就会把<>里面的类型参数给擦除,在对象进入和离开方法的时候才会添加类型检查和转换,泛型信息不会进入运行时阶段,在编译的时候就会完成。 看似new出来的`ArrayList()`和`ArrayList()`是不一样的东西,但是对于java来说,他在运行是是一样的。 * **这就是java泛型的类型擦除特性** ## 3.泛型的使用: * 主要是三种使用方式:泛型类、泛型接口、泛型方法。 ### 3.1泛型类:例:List、Set、Map。 * 泛型类的写法 可以用泛型通配符?表示未知类型 ``` class 类名<泛型标识>{ private 泛型标识 参数; ... } ``` 定义了泛型类,也不一定一定要传入泛型类型实参,比如` ArrayList<>() `.在使用泛型的时候如果传入泛型参数,则会根据传入的泛型实参作限制。而如果不传实参则在泛型类中使用泛型方法或者成员变量定义的类型可以为任何类型。 ### 3.2泛型接口: * 泛型接口的定义和泛型类的定义差不多 #### 注意: 1.未传入泛型实参时,与泛型类的定义相同,在声明类的时候,需要将泛型的生命也一起加到类中,如: ``` class Test implements anInterface{ @override ... } ``` 2.不能是这样的 ``` class Test implements AnInterface{ @override ... } ``` ### 3.3泛型方法: * 和泛型类和泛型接口差不多 ``` public void methodName(List mlist){ ... } ``` 前面的<>里面要声明传入的形参的所有泛型类型,否则会报错 ## 4泛型上下界 * 在使用泛型的时候,我们还可以为传入的的泛型类型实参进行上下边界的限制,比如: 类型实参只准传入某种类型的父类或者某种类型的子类 ``` public class BaseModel

{ public P mPresenter; public BaseModel(P mPresenter){ this.mPresenter=mPresenter; } } ``` 这样就可以保证我的某个Model在继承BaseModel后构造实例时,一定要传入继承自BasePrenster的子类,很好的将某一层的Model和Prenster绑定起来当然这样的写法也可以写到泛型方法里。 ## 5关于T和?: * T 代表一种类型 1.加在类上`class SuperClass{}` 2.加在方法上`public void method(T[],Class c){}` 这里的就是要用到的泛型参数,若类中已经传入了这个同名的类型实参,则这里可以不传,可以省略。 * ?是通配符,泛指所有类型 一般用于定义一个引用变量,好处是定义的一个变量可以指向多个对象。 ``` SuperClass sup = new SuperClass(); sup = new SuperClass (); sup = new SuperClass (); ``` 如果不是?,则 ``` SuperClass sup = new SuperClass(); SuperClass sup = new SuperClass (); SuperClass sup = new SuperClass (); ``` 而这里的具体的类名就相当于T,这个时候?会更好一点,不用重复构造对象。 * 总的来说,一般的使用场景不同 1.主要是声明泛型类和方法。 2.主要是使用泛型类和方法时。 ## over...