目录
一:概念
把明确数据类型的工作提前到编译时期,在创建对象的时候明确。这种有点像把类型
当作参数进行传递,所以泛型还有另外一种叫法:参数化类型。
二: 格式
<数据类型>
注意:这里的数据类型只能是引用数据类型
三:好处
1、将运行时期的问题提前到编译时期
2、避免了强制类型转化
3、优化了代码程序,消除不必要的黄色警告线
自动装箱 JDK1.5之后出现的(就是传入int型或者字符型数据会自动转成对应的引用数据类型)
四:泛型类
1:概念
泛型类:把泛型定义在类上面
格式:public class 类名 <泛型类型1,…>
这里的<>里面的内容仅仅表示的是一种参数类型,参数类型是一种变量,既然是一种变量
就符合我们的命名规则,可以是任意符合标识符起名规则的名字。
2:例子
Class LinkedList<E>
Class ArrayList<E>
其中E就是泛型类型可以是任意引用类型,在创建对象时如果指定了类型的话就只能添加指定类型的数据
package day27;
import java.util.ArrayList;
public class Test11 {
public static void main(String[] args) {
ArrayList<String> s= new ArrayList<String>();
//创建一个ArrayList对象指定他的泛型为字符串
s.add("hello");
s.add("java");
//添加其他元素会编译出错
s.add(1);
}
}
/*Error:(10, 10) java: 对于add(int), 找不到合适的方法
方法 java.util.Collection.add(java.lang.String)不适用
(参数不匹配; int无法转换为java.lang.String)
方法 java.util.List.add(java.lang.String)不适用
(参数不匹配; int无法转换为java.lang.String)
方法 java.util.AbstractCollection.add(java.lang.String)不适用
(参数不匹配; int无法转换为java.lang.String)
方法 java.util.AbstractList.add(java.lang.String)不适用
(参数不匹配; int无法转换为java.lang.String)
方法 java.util.ArrayList.add(java.lang.String)不适用
(参数不匹配; int无法转换为java.lang.String)
*/
五:泛型方法
1:概念
把泛型定义在方法上
格式:public 返回类型 方法名<泛型类型 .>
2:注意
//但是有个问题。没有一定要规定方法传入的参数类型要和类的类型要一致
//如果我们的类上面没有泛型的话,方法还能不能随便传参呢?
(可以,没有要求方法用泛型类也要)
当指定泛型以后只能传入指定的类型数据
六:泛型接口
把泛型定义在接口上
格式:public interface 接口名
七:泛型高级(通配符)
1:任意类型
泛型通配符<?> 任意类型,如果没有明确,那么就是Object以及任意的Java类了
例如:ArrayList<?> objects1 = new ArrayList<Animals>();
2:? extends E 向下限定,E及其子类
例如:ArrayList<? extends Animals> objects3 = new ArrayList<Animals>();
后面可以时Animals以及他的子类
ArrayList<? extends Object> objects4 = new ArrayList<Animals>();
后面可以时Object以及他的子类
3:? super E 向上限定,E及其父类
ArrayList<?super Cat> objects5 = new ArrayList<Animals>();
可以是Cat以及Cat的父类
ArrayList<?super Animals> objects6 = new ArrayList<Animals>();
可以时Animals以及其的父类