一个朋友圈泛型问题引发的“案子” 港控/mmm° 2022-06-05 11:46 122阅读 0赞 # # 昨天朋友圈问了一个问题: 对于下面的list,何如在list添加一个Integer型整数? ArrayList<String> list = new ArrayList<String>(); 有这样几种回答: * 1.不知道(非专业回答) * 2.硬塞(非专业回答) * 3.把String 改成Integer再添加(违背了问题初衷) * 4.把String改成Object,可以加任意类型(违背了问题初衷) * 5.String换成通配符 * 6.反射 对于1、2就不说了,属于搞事情的!3、4、5三种方式违背了问题的初衷,如果可以改,那我们直接new三个ArrayList就可以了。6反射,这个是无限接近的,那么这个和反射有什么关系呢?下来看下下面几个例子: public static void main(String[] args) { ArrayList list=new ArrayList(); ArrayList<String> str_list=new ArrayList<String>(); ArrayList<Integer> int_list=new ArrayList<Integer>(); ArrayList<Object> obj_list=new ArrayList<Object>(); //对象比较 System.out.println(list == str_list); System.out.println(list == int_list); System.out.println(list == obj_list); //对象的运行时class比较 System.out.println(list.getClass() == str_list.getClass()); System.out.println(list.getClass() == int_list.getClass()); System.out.println(list.getClass() == obj_list.getClass()); } 结果: false false false true true true 其实上面三个很容易理解,不同对象在内存中的地址肯定是不同的,因此均为false;下面三个均为true?是的,确实为true,这就引出了朋友圈的那个问题。为什么不同的三个对象,他们的getClass是一样的,不应该是有三个不同的hashCode吗?这个其实就是泛型编译时和运行时的问题。 对于泛型来说,泛型只在编译阶段有效,编译之后,集合的泛型是去泛型化的;原因:由于JVM泛型的擦除机制,在运行时JVM是不知道泛型信息的。 因此:java集合中的泛型,是来约束用户的错误输入的,只在编译时有效; 在回到问题最初,我们怎么才能将一个Integer对像放入上面定义的list中呢?既然集合中的泛型是编译时有效的,那我我们就可以通过绕过编译的方式进行插入。那么如何绕过编译时的校验呢?答案就是用反射;我们知道JAVA反射机制是指: “在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。 OK,再来看程序: ArrayList<String> str_list=new ArrayList<String>(); //获取类信息 Class c=str_list.getClass(); //获取add方法 Method m=c.getMethod("add", Object.class); //运行时调用add方法 m.invoke(str_list, 20); //输出当前str_list System.out.println(str_list); 结果: [20] 从结果可以看出,我们完成了在list中添加Integer的任务。 【泛型、反射、编译时、运行时
相关 Java泛型使用不当引发的问题实例 在Java编程中,泛型(Generics)是一种强大的工具,用于创建具有类型安全的集合和容器。然而,如果使用不当,也会引发问题。以下是一个实例: 1. 错误理解: 有些 末蓝、/ 2024年09月20日 02:33/ 0 赞/ 2 阅读
相关 Java泛型使用不当引发的问题 在Java编程中,泛型(Generics)是一种强大的工具,用于创建可重用、类型安全的类和方法。但如果使用不当,也会带来一些问题: 1. 泛型参数未指定类型:如果在声明泛型时 绝地灬酷狼/ 2024年09月18日 14:12/ 0 赞/ 15 阅读
相关 Java泛型使用不当引发的常见问题 在Java中,泛型是一种强大的工具,它允许我们在编写代码时避免类型擦除。然而,如果使用不当,也会产生一些常见问题。以下是几个常见的例子: 1. 泛型参数不完全限定: ```j 「爱情、让人受尽委屈。」/ 2024年09月16日 07:42/ 0 赞/ 16 阅读
相关 简单介绍Java泛型滥用引发的问题 Java泛型,虽然在设计时提供了一种强大的类型安全机制,但如果滥用,也会带来一些问题: 1. **编译器警告**:过度使用泛型会导致编译器发出警告,因为某些情况下泛型的类型参 亦凉/ 2024年09月16日 06:06/ 0 赞/ 14 阅读
相关 简单介绍Java泛型滥用引发的问题 Java泛型,虽然在设计时提供了一种强大的类型安全机制,但如果滥用,也会带来一些问题: 1. **编译器警告**:过度使用泛型会导致编译器发出警告,因为某些情况下泛型的类型参 太过爱你忘了你带给我的痛/ 2024年09月16日 06:06/ 0 赞/ 11 阅读
相关 Java泛型使用不当引发的常见问题 在Java编程中,泛型是一种强大的工具,用于创建可重用的容器类。然而,如果使用不当,也可能会导致一些常见的问题,如下: 1. 泛型擦除:编译器在运行时会消除泛型信息,这可能导 逃离我推掉我的手/ 2024年09月15日 04:36/ 0 赞/ 19 阅读
相关 Java泛型滥用:一个引发性能问题的场景 在Java编程中,泛型(Generics)是一种强大的工具,它允许我们在编写类、接口或方法时,定义类型参数,使得生成的对象具有通用性。 然而,如果在使用泛型时滥用,可能会引发 青旅半醒/ 2024年09月12日 07:48/ 0 赞/ 20 阅读
相关 朋友圈 1、题目描述 班上有 N 名学生。其中有些人是朋友,有些则不是。他们的友谊具有是传递性。如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 雨点打透心脏的1/2处/ 2022年10月01日 06:47/ 0 赞/ 185 阅读
相关 一个朋友圈泛型问题引发的“案子” 昨天朋友圈问了一个问题: 对于下面的list,何如在list添加一个Integer型整数? ArrayList<String> list = new 港控/mmm°/ 2022年06月05日 11:46/ 0 赞/ 123 阅读
还没有评论,来说两句吧...