泛型 知识点 总结
程序员文章站
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>
* }
*/
关于父类泛型和子类泛型的关系,要么同时擦除,要么子类的泛型数大于父类,属性类型父类随父类而定,子类随子类而定
方法类型随父类而定
子类继承为泛型类而父类不指定类型为擦除父类的类型
上一篇: C语言基础知识