【java】泛型的作用是在编译阶段防止错误输入,绕过编译就绕过泛型,可用反射验证

 1 package com.tn.collect;
 2
 3 import java.lang.reflect.Method;
 4 import java.util.ArrayList;
 5
 6 public class Fanxin {
 7     public static void main(String[] args){
 8         //泛型的作用是在编译阶段防止错误输入,绕过编译就绕过了泛型
 9         //反射都是绕过编译操作
10         ArrayList<String> str=new ArrayList<String>();
11         str.add("你好!");
12         ArrayList str2=new ArrayList();
13
14         //结果是true说明类类型是一样的,编译后是去泛型化的
15         System.out.println(str.getClass()==str2.getClass());
16         System.out.println(str.getClass()==ArrayList.class);
17
18         //用add方法的反射
19         try{
20             Method method=str.getClass().getMethod("add", new Class[]{Object.class});
21             method.invoke(str, new Object[]{100});
22         }catch(Exception e){
23             e.printStackTrace();
24         }
25
26         System.out.println(str.size());
27         System.out.println(str);
28
29         for(String s:str){
30             System.out.println(s);
31         }
32     }
33 }

运行结果:

true
true
2
[你好!, 100]
你好!
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at com.tn.collect.Fanxin.main(Fanxin.java:29)

时间: 2025-01-18 02:32:36

【java】泛型的作用是在编译阶段防止错误输入,绕过编译就绕过泛型,可用反射验证的相关文章

javascript运行过程中的“预编译阶段”和“执行阶段”

javascript相对于其它语言来说是一种弱类型的语言,在其它如java语言中,程序的执行需要有编译的阶段 而在javascript中也有类似的“预编译阶段”(javascript的预编译是以代码块为范围<script></script>,即每遇到一个代码块都会进行  预编译>执行), 首先科普下javascript中的两种声明方式,var和function,前者声明的是变量,后者声明的是方法 在预编译中,javascript对这两种声明做出了两种处理方案 <scri

自动属性(编译阶段和运行阶段的不同是什么,托管和非托管的不同)

public class student { public int Id{get;set;}这个就是自动属性,在编译阶段完成 } 问题1:编译阶段和运行阶段的不同 编译阶编译器干了什么事情 答: 问题2:运行阶段干了什么事情 答: 问题3:托管代码和非托管代码的区别 4.

java5核心基础之泛型(3)-泛型作用于编译阶段-怎样将String对象传入Integer类型的泛型对象中?

泛型作用于编译阶段: 泛型是作用于编译阶段,在编译阶段控制类型,以确保在编写代码的时候仅仅能传入指定类型数据到泛型集合对象中去. 怎样验证呢,贴代码例如以下: package highBasic.generic; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; public class StringAddToGeneri

java5核心基础之泛型(3)-泛型作用于编译阶段-如何将String对象传入Integer类型的泛型对象中?

泛型作用于编译阶段: 泛型是作用于编译阶段,在编译阶段控制类型,以确保在编写代码的时候只能传入指定类型数据到泛型集合对象中去.如何验证呢,贴代码如下: package highBasic.generic; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; public class StringAddToGenericInt

java泛型的作用及其基本概念

一.泛型的基本概念 java与c#一样,都存在泛型的概念,及类型的参数化.java中的泛型是在jdk5.0后出现的,但是java中的泛型与C#中的泛型是有本质区别的,首先从集合类型上来说,java 中的ArrayList<Integer>和ArrayList<String>是同一个类型,在编译时会执行类型擦除,及java中的类型是伪泛型,伪泛型将会在后面介绍,其次,对于像集合中添加基本类型的数据时,例如int,会首先将int转化成Integer对象,即我们通常所说的装箱操作,在取出

java泛型的作用和好处

转载于:https://blog.csdn.net/u012760183/article/details/52092692 之前参加面试的时候遇到面试官问泛型的作用,只是说了大概自己的理解, 在此转载记录一下,加深印象 泛型好处: 泛型简单易用 类型安全 泛型的主要目标是实现java的类型安全. 泛型可以使编译器知道一个对象的限定类型是什么,这样编译器就可以在一个高的程度上验证这个类型 消除了强制类型转换 使得代码可读性好,减少了很多出错的机会 Java语言引入泛型的好处是安全简单.泛型的好处是

Java 泛型的作用及其基本概念

一.泛型的基本概念 java与c#一样,都存在泛型的概念,及类型的参数化.java中的泛型是在jdk5.0后出现的,但是java中的泛型与C#中的泛型是有本质区别的,首先从集合类型上来说,java 中的ArrayList<Integer>和ArrayList<String>是同一个类型,在编译时会执行类型擦除,及java中的类型是伪泛型,伪泛型将会在后面介绍,其次,对于像集合中添加基本类型的数据时,例如int,会首先将int转化成Integer对象,即我们通常所说的装箱操作,在取出

Java中带包(创建及引用)的类的编译与调试

Java中带包(创建及引用)的类的编译与调试 java源程序的编译大家都知道,也就是cmd中到源文件所在目录下javac **.java即可,当程序中有包声明还能简简单单的直接javac **.java吗?答案当然是no,下面举个简单的例子证明一下直接javac **.java会怎么样. 如下:F:\javaweb2班\20160531目录下有A.java文件,注意源文件中有包声明 package mypack; public class A { String name; int age; pu

预处理与编译阶段

一.C语言由源代码生成的各阶段如下: C源程序->编译预处理->编译->优化程序->汇编程序->链接程序->可执行文件 其中 编译预处理阶段,读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理.或者说是扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器.预处理过程先于编译器对源代码进行处理. 在C 语言中,并没有任何内在的机制来完成如下一些功能:在编译时包含其他源文件.定义宏.根据条件决定编译时是否包含某些代码.要完成这些工作,就需要使用预处理程序