首页
学习
活动
专区
圈层
工具
发布

掌握8条泛型规则,打造优雅通用的Java代码

>如果使用泛型Object则可以存放任何对象,因为Object是所有类的父类但是对象从集合中取出时,只能转换为Object,如果需要转换为其他类型则还是需要强制转换 ListObject>...,实例化时使用Object数组强制转换 public class Stack { private E[] elements; private int size =...[DEFAULT_INITIAL_CAPACITY]; } }这种方案在强制时会有抑制警告,需要保证强转时是安全的(不要泄漏引用)第二种方案:使用Object数组,读取数据时进行强转...Double aDouble : doubles) { System.out.println(aDouble); }总结使用泛型能够指定对象类型,在编译期间进行类型擦除并强制转换为对应类型除了兼容历史版本...那么可以考虑使用以下两种方案:定义泛型数组,实例化由Object数组进行强转使用Object数组存储,读取数据时再强转为泛型考虑使用泛型方法,它能够给方法带来通用性、安全、灵活有限通配符能够提升灵活性,

47021
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Carson带你学Java:泛型知识知多少

    // 以ArrayList为示例 // 泛型T可以是任意类 public class ArrayListT> { private T[] array; //... } // 通过泛型的使用...背景 ArrayList的本质:一个可变的Object类型数组 public class ArrayList { private Object[] array; // ... } 2....问题 在使用ArrayList存储不同类型时,需要强转类型,不然容易出现ClassCastException异常。...即: // 泛型T可以是任意类 public class ArrayListT> { private T[] array; //... } // 多种类型 // 1....类型来进行多种类型数据的操作,此时操作最多的是针对该Object进行数据的强制转换 而这种转换是基于开发者对该数据类型明确的情况下进行(如将Object型转换为String型);若类型不一致,编译器在编译过程中不会报错

    51420

    Java集合、数组与泛型中的几个陷阱,你掉进了几个?

    下面我总结了集合、泛型、数组转集合等一些常见的陷进,认真看完,相信你绝对有所收获。 1、List ,List 与 ListObject> 有区别吗?...extends T> a,a 这个变量可以接受 T 及其 T 子类的集合,上界为 T,并且从 a 取出来的类型都会被强制转换为 T。...extends T> 有点相反。对于 T> a,a 这个变量可以接受 T 及其 T 父类的集合,下界为 T,并且从 a 取出来的类型都会被强制转换为 Object。...extends T> a ,可以把 a 及其 a 的子类赋给 a,从 a 里取的元素都会被强制转换为 T 类型,不过需要注意的是,不能向 a 添加任何除 null 外是元素。 2、ListT> a ,可以把 a 及其 a 的父类赋给 a,从 a 里取的元素都会被强制转换为 Object 类型,不过需要注意的是,可以向 a 添加元素,但添加的只能是 T 及其子类元素。

    95820

    Java集合、数组与泛型中的几个陷阱,你掉进了几个?

    本文字数:4300 字 阅读本文大概需要:12分钟 下面我总结了集合、泛型、数组转集合等一些常见的陷进,认真看完,相信你绝对有所收获。 1、List ,ListT> a,a 这个变量可以接受 T 及其 T 子类的集合,上界为 T,并且从 a 取出来的类型都会被强制转换为 T。...extends T> 有点相反。对于 T> a,a 这个变量可以接受 T 及其 T 父类的集合,下界为 T,并且从 a 取出来的类型都会被强制转换为 Object。...extends T> a ,可以把 a 及其 a 的子类赋给 a,从 a 里取的元素都会被强制转换为 T 类型,不过需要注意的是,不能向 a 添加任何除 null 外是元素。 2、ListT> a ,可以把 a 及其 a 的父类赋给 a,从 a 里取的元素都会被强制转换为 Object 类型,不过需要注意的是,可以向 a 添加元素,但添加的只能是 T 及其子类元素。

    1K30

    Java数组 强制类型转换

    数组的强制类型转换 数组的强制类型转换 数组类型转换的问题为什么会出现在我脑海中? 数组的强制类型转换 最重要的是!!!最开始的时候声明的数组类型!!! 最重要的是!!!...class java.lang.Integer   根据实验,一开始就声明为String数组,可以在需要时自动转为Object数组,之后可以通过强制类型转换再转回String数组。   ...但是,如果一开始就声明为Object数组,那么,即便这个数组中存放的全部是String对象,也是不能转换为String数组的!!! 数组类型转换的问题为什么会出现在我脑海中?...我自己用String数组转换成Object数组之后,是可以转回String数组的呀,为什么这里就转不回去,而且报错了呢??????...虽然我不清楚它做了什么,但是有两点可以确定: 源代码既然在强转的时候没有报错,说明该方法的返回的实际对象一定是T子类的数组。而T类型是什么呢?

    2.3K40

    Java泛型深入理解「建议收藏」

    擦除 类型变量,并替换为 限定类型(T为无限定的 类型变量,用Object替换)。...这说明ArrayList泛型信息在编译之后被擦除了,只保留了原始类型,类型变量(T)被替换为Object,在运行时,我们可以行其中插入任意类型的对象。...也就是说,编译器把这个方法调用翻译为两条字节码指令: 对原始方法Pair.getValue的调用 将返回的Object类型强制转换为Integer 此外,存取一个泛型域时,也要插入强制类型转换。...因为当类型擦除后,ArrayList的原始类中的类型变量(T)替换为Object,但Object类型不能存储double值。...可以代表任意类型,“任意”也就是未知类型。 ListObject>与List并不等同,ListObject>是List的子类。还有不能往List<?

    1.1K20

    Java基础篇:泛型与类型擦除

    二、泛型的好处: 没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。...super T> 表示类型的下界,参数化类型是此T类型的超类型,直至object; 上界什么时候用:往集合中添加元素时,既可以添加T类型对象,又可以添加T的子类型对象。为什么?...类型,之后在获取的时候再强制类型转换为对应的类型,因此生成的Java字节码中是不包含泛型中的类型信息的,即运行期间并没有泛型的任何信息。...当接口、类及方法中的操作的引用数据类型不确定的时候,以前用的Object来进行扩展的,现在可以用泛型来表示。这样可以避免强转的麻烦,而且将运行问题转移到的编译时期。...(3)等式两边可以在任意一边使用泛型,在另一边不使用(考虑向后兼容); ArrayListal = new ArrayListObject>(); //错 //要保证左右两边的泛型具体类型一致就可以了

    1.4K22

    数组与List的互转及原理分析

    //数组转集合 //方法一:使用Arrays.asList(),但是要注意转换后的list不能做大小和结构性更改 Integer[] a = {2,5,7,8,9,6}; List list...//数组转集合 //方法一:使用Arrays.asList(T...a),但是要注意转换后的list不能做大小和结构性更改 Integer[] a = {2,5,7,8,9,6}; List...所以必须要准备一数组容器来接收,而且必须是一个Object[]类型的,所以我们使用第一个方法的话会得到一个Object[]数组,想要使用,就有要将数组里的元素遍历在强制转换为我们的类型,这个相对来说麻烦了些.....a) 参数类型是可变参数,就是参数个数不确定,可放任意个,底层实现是数组实现的,有兴趣的小伙伴可深入了解。...+[2, 5, 7, 8, 9, 6] 总结:我们介绍了数组转list的两种方法:第一是asList:list = Arrays.asList(a) list = new ArrayList(Arrays.asList

    66430

    Java 泛型

    也就是 集合中第二个数据是 Integer,但是我们取出来的时候将其转换为 String 了,所以报错。   那么这个如何解决呢?   ①、我们在遍历的时候,根据每个数据的类型判断,然后进行强转。...那么我们说这个集合只有两条数据,我们可以进行判断强转,如果数据有成千上万条呢,我们都通过这样判断强转肯定不可取   ②、在往集合中加入数据的时候,我们就做好限制,比如这个集合只能添加 String 类型的...在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的...对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。...(gt.wildCard(obj)); //构造一个 任意类型的 集合,这和 ListObject> 存放数据没啥区别 List list = new ArrayList(); gt.wildCard

    1.7K100

    Java核心技术第八章-泛型

    类型参数的好处 在没有泛型类之前,ArrayList类只维护一个Object引用的数组: public class ArrayList { private Object[] elementData...可以向数组列表中添加任何类的对象,如果数组的类型不一致,将 get 的结果进行强制强制类型,就会错误。...在Java库中,使用变量E表示集合的元素类型,K和V分别表示表的关键字与值的类型,T、U、S表示任意类型。...Employee buddy = buddies.getFirst(); 擦除getFirst的返回类型后将返回Object类型,但是编译器将自动帮我们强制类型转换为Employee。...所以:编译器把这个方法执行操作分为两条指令: 对原始方法Pair.getFirst的调用 将返回的Object类型强制转换为Employee类型 小节总结: 虚拟机中没有泛型,只有普通的类和方法

    97410

    Java核心技术之什么是泛型

    官方这话是什么意思呢:当你从集合中取出元素时,必须将其强制转换为存储在集合中的元素类型。除了不方便,这是不安全的。编译器不会检查强制转换是否与集合的类型相同,因此强制转换可能会在运行时失败。...可以向数组列表中添加任何类的对象 arrayList.add(new File("/")); // 对于这个调用,如果将get的结果强制类型转换为String类型,就会产生一个错误 /...,一个集合里装的是 Object,那么获取返回值或元素只能强转,如果有类型转换错误,在编译器无法觉察,这就大大加大程序的错误几率!...类型擦除主要包括:一、通用类型的檫除:在类型擦除过程中,Java 编译器将擦除所有类型参数,如果类型参数是有界的,则将每个参数替换为其第一个边界;如果类型参数是无界的,则将其替换为 Object。...Object[] stringLists = new List[]; // compiler error, but pretend it's allowed 缺少数组维

    84520

    Java 泛型(Generics)全面解析:原理、应用及高级技巧

    传统代码中常使用 Object 类型来实现通用方法或容器,但这样会带来: 类型不安全 频繁的强制类型转换,代码繁琐且易错 泛型在编译时进行类型检查,保证类型安全。...:无界通配符,表示任意类型 4.2 例子java复制编辑List list1; // 只能读取,不能添加List list2; // 可以添加 Integer 及其子类五、泛型的类型擦除原理Java 泛型通过类型擦除实现向后兼容: 编译时,泛型类型被替换为原始类型(如 Object 或指定的上界...、泛型高级技巧7.1 泛型与继承 List 不是 ListObject> 的子类型 使用通配符实现灵活的参数传递 7.2 泛型数组限制Java 不允许直接创建泛型数组:java复制编辑...T[] arr = new T[10]; // 编译错误解决方法:java复制编辑@SuppressWarnings("unchecked")T[] arr = (T[]) new Object[10]

    29000
    领券