自定义泛型接口
自定义泛型接口
注意点
1.泛型类可能有多个参数,此时应该讲多个参数一起放在尖括号内,比如<E1,E2,E3>
2.泛型类的构造器与普通构造器相同,不用带尖括号
正确示例
public GenericClass(){}
错误示例
public GenericClass<E>(){}
3.实例化后,操作原来泛型位置的结构必须与指定的泛型类型一致
4.泛型不同类型的引用不能相互赋值
如以下两个变量不可相互赋值
ArrayList<String> als= new ArrayList<> ();
ArrayList<Integer> ali= new ArrayList<> ();
5.泛型吐过不指定,将会被擦除,泛型对应的类型均按照Object处理,但不等价于Object。尽量实例化泛型
6.如果泛型是一个接口或抽象类,则不可创建泛型类的对象
7.jdk1.7,泛型可简化,在等号右边不写,在左边写
8.泛型的指定中不能使用基本数据类型,可以使用包装类替换
9.在类、接口上声明的泛型,在本类或本接口中即代表某种类型,可以用于非静态属性的类型,非静态方法的参数类型和返回值类型,在静态方法中不能使用类的泛型,原因:类的泛型是实例化的时候确定的,静态方法使用的时候无法获取该参数
10.异常类不能是泛型的
11.不能使用new E[] 但是可以 E[] elements=(E[])new Object[capacity];
参考:ArrayList源码中声明 Object[] elementData, 而非泛型参数类型数组
这个感觉很不好用呢。。。
package com.atguigu.generic;
import java.util.Arrays;
/**
* 功能描述
*
* @since 2022-05-25
*/
public class GenericArray<E> {
E[] createGenericArray(int capacity) {
E[] es = (E[]) new Object[capacity];
return es;
}
public static void main(String[] args) {
GenericArray<String> genericArray = new GenericArray<>();
Object[] array = genericArray.createGenericArray(10);
array[0] = "as";
array[1] = 12;
System.out.println(Arrays.toString(array));
}
}
12.父类有泛型,子类可以选择保留泛型也可以选择指定泛型类型:
子类不保留父类的泛型:按需实现
没有类型 擦除
具体类型
子类父类的泛型,泛型子类
全部保留
部分保留
结论:子类必须是'富二代',子类除了指定或保留父类的泛型,还可以增加自己的泛型
class Father<T1, T2> {
}
//子类不保留父类的泛型
// 1)没有类型 擦除
class Son1 extends Father{//等价于class Son2 extends Father<Object,Object>{
}
// 2)具体类型
class Son2 extends Father<String, Integer>{
}
//子类保留父类的泛型
// 1)全部保留
class Son3<T1, T2> extends Father<T1, T2>{
}
// 2)部分保留
class Son4<T2> extends Father<Integer>, T2>{
}
//子类不保留父类的泛型
// 1)没有类型 擦除 Son5保留了父类泛型的基础上自己又增加两个类型
class Son5<E1, E2> extends Father{//等价于class Son2<E1, E2> extends Father<Object,Object>{
}
// 2)具体类型 Son6实例化了父类泛型的基础上自己又增加两个类型
class Son6<E1, E2> extends Father<String, Integer>{
}
//子类保留父类的泛型
// 1)全部保留
class Son7<T1, T2,E3, E4> extends Father<T1, T2>{
}
// 2)部分保留
class Son8<T2, E3> extends Father<Integer>, T2>{
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通